如何理解保留计数

时间:2013-11-28 06:26:25

标签: ios objective-c memory-management

我使用以下链接来了解保留计数 retain count in iphone
根据该问题输出:

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]);  


OUTPUT
Retain count: 2
Retain count: 1

当我在我的示例中尝试此代码时:

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]);

然后OUTPUT

Retain count: 51
Retain count: 1

我无法理解为什么NSArray的保留计数为51,并且在数组中赋值后它变为1。

我也读过
https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html
http://ranga-iphone-developer.blogspot.in/2011/11/what-is-retain-count-or-reference.html
iOS about retainCount
和其他教程。但我无法理解Retain count: 51的价值。

请帮助我。
谢谢。

1 个答案:

答案 0 :(得分:4)

有关何时以及为何使用retainCount的解释,请参阅WhenToUseRetainCount.com

由于空数组的实现细节,计数为51。它变为1,因为您获得了不同对象的计数。

如果使用manual-retain-release,则此模式是泄漏:

Foo *foo = [[Foo alloc] init];
foo = [someObject retrieveTheFooness];

分配的对象泄露。

使用ARC。