【问题标题】:Memory management in objective c arrays目标 c 数组中的内存管理
【发布时间】:2015-09-25 19:33:20
【问题描述】:

对于这个问题:

Test *t1 = [[Test alloc]init];
Test *t2 = [Test new];
Test *t3 = [t1 copy];

NSLog(@"Retain count of Object 1 : %ld",[t1 retainCount]);
NSLog(@"Retain count of Object 2 : %ld",[t2 retainCount]);
NSLog(@"Retain count of Object 3 : %ld",[t3 retainCount]);

NSArray *arr = @[t1,t2,t3];

NSLog(@"Retain count of Object 1 : %ld",[t1 retainCount]);
NSLog(@"Retain count of Object 2 : %ld",[t2 retainCount]);
NSLog(@"Retain count of Object 3 : %ld",[t3 retainCount]);

答案是:

对象 1 的保留计数:1
对象 2 的保留计数:1
对象 3 的保留计数:1
对象 1 的保留计数:3
对象 2 的保留计数:2
对象 3 的保留计数:3

我可以理解,将对象添加到数组中会将其引用计数增加 1,但对于对象 1 和 3,它会增加 2? 有人可以回答吗?

【问题讨论】:

  • 参考this
  • 引用retainCount 绝对是个坏主意,因为幕后可能会发生很多事情。 Apple 鼓励您从对象图的角度思考,而不是保留计数。
  • 是的,我是一名培训师,我需要解释为什么会这样!!
  • 不可能知道 copy 做了什么,因为它调用了您的对象的 copyWithZone: 方法,而您没有显示该方法(没有它,调用会引发异常)。

标签: objective-c arrays memory-management retain retaincount


【解决方案1】:

根据您所展示的内容(未显示该类的实现方式),这是一个猜测:

  • 您的Test 类的copyWithZone: 方法返回接收器对象本身,而不保留。 (顺便说一句,这违反了内存管理规则,即以copy 开头的方法必须返回拥有(保留)的实例。类的copy 允许返回对象本身或新对象,但在这两种情况下,它都必须保留它。)
  • 因此,t1t3 在创建对象时指向同一个对象,该对象只有 1 个保留计数。 (因为 copy 错误地没有保留。)
  • 将元素放入数组时,数组会保留每个元素。所以t2指向的对象被保留一次,保留计数为2,t1t3指向的对象被保留两次,保留计数为3。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    相关资源
    最近更新 更多