Objective c objective c阵列中的内存管理
关于这个问题:Objective c objective c阵列中的内存管理,objective-c,arrays,memory-management,retain,retaincount,Objective C,Arrays,Memory Management,Retain,Retaincount,关于这个问题: 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 ret
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?? 有人能回答这个问题吗?根据您所展示的内容(没有展示类是如何实现的),这里有一个猜测:
- 您的
类的Test
方法返回接收方对象本身,而不保留。(顺便说一句,这违反了内存管理规则,即以copyWithZone:
开头的方法必须返回拥有(保留)的实例。允许类的copy
返回对象本身或新对象,但在这两种情况下都必须保留它。)copy
- 因此,创建对象时,
和t1
指向同一个对象,该对象只有1个保留计数。(因为t3
未正确保留。)副本
- 将元素放入数组时,数组将保留每个元素。因此,
指向的对象被保留一次,保留计数为2,而t2
和t1
指向的对象被保留两次,保留计数为3t3
retainCount
肯定是个坏主意,因为引擎盖下可能会发生很多事情。苹果鼓励你用对象图来思考,而不是保留计数。是的,我是一名培训师,我需要一个解释为什么会发生这种情况!!不可能知道copy
做了什么,因为它调用了对象的copyWithZone:
方法,您没有显示该方法(如果没有该方法,调用将引发异常)。谢谢,这很有帮助