【问题标题】:Memory management of NSArray [duplicate]NSArray的内存管理[重复]
【发布时间】:2016-01-14 09:54:20
【问题描述】:

这是我的代码:

NSNumber *tempNum = [NSNumber numberWithInt:5];
NSMutableArray *array = [NSMutableArray arrayWithObjects:tempNum,@"A", nil];
tempNum = nil;
NSLog(@"Array :%@",array);

输出是:

 Object :(null)
 Array :(
    5,
    A
)

任何人都可以准确解释数组是保存对象的引用还是复制对象或其他东西。

【问题讨论】:

  • “Object:(null)”从何而来?
  • NSLog(@"Object :%@",tempStr);,它的字符串不是数组对象。请检查清楚。
  • @DharmbirSingh - 好收获!
  • 这就是我要问的,在将对象保存到数组时,是引用还是复制对象
  • @DharmbirSingh,你完全错了。自己试试吧。

标签: ios objective-c object memory-management nsarray


【解决方案1】:

NS 集合类,包括NSArray,保持对添加到它们的对象的强引用。他们不创建副本。

这里有一个简单的例子来演示:

NSMutableString *s = [@"a" mutableCopy];
NSArray *a = @[ s ];

[s appendString:@"b"];

NSLog(@"a = %@, s = %@", a, s);

日志将显示as 的内容相同,即使只修改了s

【讨论】:

  • NSString *tempStr = [NSString stringWithFormat:@"Hello"]; NSMutableArray *array1 = [NSMutableArray arrayWithObjects:tempStr,@"A", nil]; NSMutableArray *array2 = [NSMutableArray 数组]; [array2 addObject:[array1 objectAtIndex:0]]; NSString *string2 = [array2 objectAtIndex:0]; string2 = @"世界"; // [string2 stringByAppendingString:@"World"]; NSLog(@"Array1 :%@",array1); NSLog(@"Array2 :%@",array2);输出: Array1 :( Hello, A ) Array2 :( Hello ) 在这种情况下,它会复制
  • 您有问题吗?
  • 当您执行 string2 = @"World" 时,您将使用新字符串 (World) 覆盖对数组中第一个对象的引用。您正在分配一个值为 World 的新字符串并将其分配给变量 string2,而不是更改数组中的值。
  • @Avi 你能告诉我假设我有 NSString 对象不是不可变对象,并且想在这种情况下使用 stringWithFormat 方法添加其他字符串,为什么它不修改数组?
  • @DharmbirSingh,您正在修改与数组中相同的引用,或者您没有。代码在哪里?
【解决方案2】:

数组保存了对NSNumber 对象的强引用,当您取消tempNum 时,对数字的引用不再在 tempNum 变量中,但由于数组具有对它的引用,因此不会释放对象。 更多信息在这里:Does NSArray copy objects?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多