Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c objective c阵列中的内存管理_Objective C_Arrays_Memory Management_Retain_Retaincount - Fatal编程技术网

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
    t3
    指向同一个对象,该对象只有1个保留计数。(因为
    副本
    未正确保留。)
  • 将元素放入数组时,数组将保留每个元素。因此,
    t2
    指向的对象被保留一次,保留计数为2,而
    t1
    t3
    指向的对象被保留两次,保留计数为3

Ref引用
retainCount
肯定是个坏主意,因为引擎盖下可能会发生很多事情。苹果鼓励你用对象图来思考,而不是保留计数。是的,我是一名培训师,我需要一个解释为什么会发生这种情况!!不可能知道
copy
做了什么,因为它调用了对象的
copyWithZone:
方法,您没有显示该方法(如果没有该方法,调用将引发异常)。谢谢,这很有帮助