2015-09-04 199 views
1

什么是保留计数的val和arr在下面的代码片段?iOS保留计数

NSString *[email protected]"qaz"; 

NSMutableArray *arr=[[NSMutableArray alloc]init]; 

[arr addObject:val]; 

考虑到我们在MRC。

什么是str1,str2,str3和str4的保留计数

NSString *str1=[[NSString alloc]initwithString:@"str"]; 

NSString * str2=[str1 copy]; 

NSString * str3=[str1 retain]; 

NSString * str4=str3; 

我很困惑与保留计数有人帮我解释

+0

你不应该关心实际的数字。 – trojanfoe

+2

内存管理的概念需要相当多的文本来解释,苹果已经为它写了一个很好的指导; [高级内存管理编程指南](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html)。 – Mats

回答

4
NSString *[email protected]"qaz"; // @"qaz" Counting = 1, handled by val 

NSMutableArray *arr=[[NSMutableArray alloc]init]; // NSMutableArray Counting = 1, handled by arr 

[arr addObject:val]; // nothing changes 

MRC

NSString *str1=[[NSString alloc]initwithString:@"str"]; // @"str" Counting = 1 

NSString * str2=[str1 copy]; // @"str" Counting = 1; the "copy @"str"" Counting = 1 handled by str2  
NSString * str3=[str1 retain]; // @"str" Counting = 2; the "copy @"str"" Counting = 1 

NSString * str4=str3; // nothing changes 

分配/初始化,保留:增加引用计数。

复制:创建具有计数= 1另一个目的,不增加复制的对象的计数

推出:减少引用计数。

在ARC模式下,您不必调用release,只需要设置pointer = nil即可。如果没有指针处理它,则对象将被释放。

+0

那么当对象的保留数增加时呢?你能解释一些例子吗? – NaveenKumar

+1

你可以参考@Mats的链接https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html – anhtu