MST

星途 面试题库

面试题:Objective-C字典在内存管理方面的特点

阐述Objective-C字典(NSDictionary和NSMutableDictionary)在ARC和MRC环境下内存管理的不同特点。如果字典中的对象被释放,字典本身会如何处理?请结合引用计数机制进行分析。
49.2万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

ARC(自动引用计数)环境下

  1. NSDictionary
    • 内存管理特点:ARC 自动管理对象的生命周期。当创建 NSDictionary 时,字典会对其包含的键值对对象进行强引用。例如,如果创建一个 NSDictionary 并传入一些对象作为键值对:
    NSString *key = @"key";
    NSString *value = @"value";
    NSDictionary *dict = @{key: value};
    
    这里 dict 会对 keyvalue 进行强引用。当 dict 超出其作用域或者被赋值为 nil 时,ARC 会自动减少 keyvalue 的引用计数。如果 keyvalue 的引用计数降为 0,它们会被自动释放。
    • 对象释放时字典的处理:当字典中的某个对象(无论是键还是值)在其他地方被释放(引用计数降为 0)时,由于字典对其是强引用,只要字典本身还存在,该对象不会被真正释放。只有当字典本身被释放(引用计数降为 0)时,字典对其包含对象的强引用才会消失,这些对象的引用计数才会相应减少,若减少后变为 0 则会被释放。
  2. NSMutableDictionary
    • 内存管理特点:与 NSDictionary 类似,NSMutableDictionary 在 ARC 下也对其包含的键值对对象进行强引用。例如:
    NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary];
    NSString *mutableKey = @"mutableKey";
    NSString *mutableValue = @"mutableValue";
    [mutableDict setObject:mutableValue forKey:mutableKey];
    
    mutableDictmutableKeymutableValue 进行强引用。在 ARC 下,添加、移除或替换对象时,ARC 会自动处理引用计数的变化。比如移除一个对象时,字典对该对象的强引用会消失,对象的引用计数会相应减少。
    • 对象释放时字典的处理:如果字典中的对象在其他地方被释放,只要字典对其还有强引用,对象就不会真正被释放。当从 NSMutableDictionary 中移除一个对象时,字典对该对象的强引用被移除,对象的引用计数减少。若引用计数降为 0,对象会被释放。

MRC(手动引用计数)环境下

  1. 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 会对 mrcKeymrcValue 进行 retain 操作,增加它们的引用计数。当不再需要 mrcDict 时,开发者需要手动调用 [mrcDict release],这会减少 mrcDict 的引用计数。同时,当 mrcDict 被释放时,它会对其包含的对象进行 release 操作,减少这些对象的引用计数。
    • 对象释放时字典的处理:如果字典中的某个对象在其他地方被手动 release 且引用计数降为 0 被释放,而字典还对其有 retain 操作(引用计数不为 0),那么字典不受影响。只有当字典本身被 release,对其包含对象的 retain 操作才会取消(通过 release 减少引用计数),若这些对象的引用计数降为 0 则会被释放。
  2. 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];
    
    这里 mrcMutableDictmrcMutableKeymrcMutableValue 进行 retain 操作。在 MRC 下,添加对象时会 retain 对象(增加引用计数),移除对象时需要手动 release 对象(减少引用计数)。
    • 对象释放时字典的处理:如果字典中的对象在其他地方被手动 release 且引用计数降为 0 被释放,而字典还对其有 retain 操作,字典本身不受影响。当从 NSMutableDictionary 中移除一个对象时,开发者需要手动 release 该对象(减少引用计数),若引用计数降为 0 对象会被释放。当 NSMutableDictionary 本身被 release 时,它会对其包含的所有对象进行 release 操作,减少这些对象的引用计数,若引用计数降为 0 则对象会被释放。