面试题答案
一键面试ARC(自动引用计数)环境下
- NSDictionary
- 内存管理特点:ARC 自动管理对象的生命周期。当创建
NSDictionary
时,字典会对其包含的键值对对象进行强引用。例如,如果创建一个NSDictionary
并传入一些对象作为键值对:
这里NSString *key = @"key"; NSString *value = @"value"; NSDictionary *dict = @{key: value};
dict
会对key
和value
进行强引用。当dict
超出其作用域或者被赋值为nil
时,ARC 会自动减少key
和value
的引用计数。如果key
和value
的引用计数降为 0,它们会被自动释放。- 对象释放时字典的处理:当字典中的某个对象(无论是键还是值)在其他地方被释放(引用计数降为 0)时,由于字典对其是强引用,只要字典本身还存在,该对象不会被真正释放。只有当字典本身被释放(引用计数降为 0)时,字典对其包含对象的强引用才会消失,这些对象的引用计数才会相应减少,若减少后变为 0 则会被释放。
- 内存管理特点:ARC 自动管理对象的生命周期。当创建
- NSMutableDictionary
- 内存管理特点:与
NSDictionary
类似,NSMutableDictionary
在 ARC 下也对其包含的键值对对象进行强引用。例如:
NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary]; NSString *mutableKey = @"mutableKey"; NSString *mutableValue = @"mutableValue"; [mutableDict setObject:mutableValue forKey:mutableKey];
mutableDict
对mutableKey
和mutableValue
进行强引用。在 ARC 下,添加、移除或替换对象时,ARC 会自动处理引用计数的变化。比如移除一个对象时,字典对该对象的强引用会消失,对象的引用计数会相应减少。- 对象释放时字典的处理:如果字典中的对象在其他地方被释放,只要字典对其还有强引用,对象就不会真正被释放。当从
NSMutableDictionary
中移除一个对象时,字典对该对象的强引用被移除,对象的引用计数减少。若引用计数降为 0,对象会被释放。
- 内存管理特点:与
MRC(手动引用计数)环境下
- NSDictionary
- 内存管理特点:在 MRC 下,开发者需要手动管理对象的引用计数。当创建
NSDictionary
时,字典会对其包含的键值对对象进行 retain(相当于增加引用计数)操作。例如:
这里NSString *mrcKey = [[NSString alloc] initWithString:@"mrcKey"]; NSString *mrcValue = [[NSString alloc] initWithString:@"mrcValue"]; NSDictionary *mrcDict = [[NSDictionary alloc] initWithObjectsAndKeys:mrcValue, mrcKey, nil];
mrcDict
会对mrcKey
和mrcValue
进行 retain 操作,增加它们的引用计数。当不再需要mrcDict
时,开发者需要手动调用[mrcDict release]
,这会减少mrcDict
的引用计数。同时,当mrcDict
被释放时,它会对其包含的对象进行 release 操作,减少这些对象的引用计数。- 对象释放时字典的处理:如果字典中的某个对象在其他地方被手动 release 且引用计数降为 0 被释放,而字典还对其有 retain 操作(引用计数不为 0),那么字典不受影响。只有当字典本身被 release,对其包含对象的 retain 操作才会取消(通过 release 减少引用计数),若这些对象的引用计数降为 0 则会被释放。
- 内存管理特点:在 MRC 下,开发者需要手动管理对象的引用计数。当创建
- NSMutableDictionary
- 内存管理特点:
NSMutableDictionary
在 MRC 下同样对其包含的键值对对象进行 retain 操作。例如:
这里NSMutableDictionary *mrcMutableDict = [[NSMutableDictionary alloc] init]; NSString *mrcMutableKey = [[NSString alloc] initWithString:@"mrcMutableKey"]; NSString *mrcMutableValue = [[NSString alloc] initWithString:@"mrcMutableValue"]; [mrcMutableDict setObject:mrcMutableValue forKey:mrcMutableKey];
mrcMutableDict
对mrcMutableKey
和mrcMutableValue
进行 retain 操作。在 MRC 下,添加对象时会 retain 对象(增加引用计数),移除对象时需要手动 release 对象(减少引用计数)。- 对象释放时字典的处理:如果字典中的对象在其他地方被手动 release 且引用计数降为 0 被释放,而字典还对其有 retain 操作,字典本身不受影响。当从
NSMutableDictionary
中移除一个对象时,开发者需要手动 release 该对象(减少引用计数),若引用计数降为 0 对象会被释放。当NSMutableDictionary
本身被 release 时,它会对其包含的所有对象进行 release 操作,减少这些对象的引用计数,若引用计数降为 0 则对象会被释放。
- 内存管理特点: