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 对象本身或新对象,但在这两种情况下都必须保留它。)
- 因此,
t1
和t3
指向同一个对象,在对象创建的时候只有1个retain count。 (因为 copy
错误地没有保留。)
- 当您将元素放入数组时,数组会保留每个元素。因此
t2
指向的对象被保留一次,保留计数为 2,而 t1
和 t3
指向的对象被保留两次,保留计数为 3。
对于这个问题:
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 对象本身或新对象,但在这两种情况下都必须保留它。) - 因此,
t1
和t3
指向同一个对象,在对象创建的时候只有1个retain count。 (因为copy
错误地没有保留。) - 当您将元素放入数组时,数组会保留每个元素。因此
t2
指向的对象被保留一次,保留计数为 2,而t1
和t3
指向的对象被保留两次,保留计数为 3。