在iphone中保留计数

Ran*_*wan 1 iphone objective-c count

我已经习惯[anArray retainCount]了数组的保留计数..(我知道不应该使用这个,但我只是用于学习保留概念)

以下是我的代码.


NSString *str = [[NSString alloc] initWithFormat:@"a,b,c,d"];
NSArray  *anArray =[[NSArray alloc]init];
NSLog(@"Retain count: %i", [anArray retainCount]);
anArray=[str componentsSeparatedByString:@","];
NSLog(@"Retain count: %i", [anArray retainCount]);  
Run Code Online (Sandbox Code Playgroud)

产量

Retain count: 2
Retain count: 1
Run Code Online (Sandbox Code Playgroud)

我认为它应该相反但......

Dav*_*har 7

请不要自己一个忙,retainCount努力学习内存管理规则是如何工作的.请参阅友好的Apple 内存管理指南.

在你的例子中:

 NSArray  *anArray =[[NSArray alloc]init];
Run Code Online (Sandbox Code Playgroud)

你已经分配了"anArray"(通过调用alloc),所以你负责打电话release.

anArray=[str componentsSeparatedByString:@","];
Run Code Online (Sandbox Code Playgroud)

现在,您已经获得了一个新对象(泄漏原始对象,如seand所说).这次,您不拥有该对象(因为componentsSeparatedByString没有alloccopy在其名称中),因此您不能释放它.

不要担心retainCount是什么; 倾向于你自己的编织和释放你应该和不释放你不拥有的对象的对象.


sea*_*and 5

这一行... anArray = [str componentsSeparatedByString:@","];

你压缩了'anArray'的原始分配(从而造成了泄漏).在现实生活中,你首先想要[anArray发布].这就是保留计数回到1的原因.