NSArray *arr=[[NSArray alloc]init]; //Am getting all immutable objects allocation that retain count:2
NSLog(@"dic1:%d",[arr retainCount]);
[arr retain];
[arr retain];
[arr retain];
[arr release];
NSLog(@"dic2:%d",[arr retainCount]);
NSMutableDictionary *dic=[[NSMutableDictionary alloc]init];//Am getting all mutable objects allocation that retain count:1
NSLog(@"dic3:%d",[dic retainCount]);
[dic retain];
[dic retain];
[dic retain];
[dic release];
NSLog(@"dic4:%d",[dic retainCount]);
输出:dic1:2 DIC2:4 dic3:1 DIC4:3
可变对象之间的差异是什么,保留计数和不可变对象保留计数?请给我解决方案......
答案 0 :(得分:6)
如果添加以下行
NSLog(@"%p %p %p", [NSArray new], [NSArray new], [NSArray new]);
然后您会注意到所有指针值都相同(而且dic1的初始值上升了3,现在从5开始)。这意味着[[NSArray alloc] init]
实际上并没有分配任何东西,只是保留了一些永远存活的单例并返回它。
从不依赖retainCount
的值,因为对象可能由运行时和框架在内部保留。有些物体甚至可能没有保留计数器。这也意味着您不应期望release
可预测会导致释放。
答案 1 :(得分:0)
永远不要使用retainCount
方法,因为它永远不会提供真实值,因为对象的内部实现可能包含retain
s,因此您将拥有retain
和系统的retain
s。