objective c 数组中的内存管理

Memory management in objective c arrays

对于这个问题:

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?? 有人可以回答吗?

根据您展示的内容(未显示 class 是如何实现的),这是一个猜测:

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