关于保留计数

时间:2013-01-24 07:38:20

标签: ios objective-c cocoa-touch

NSArray *arr = [[NSArray arrayWithObjects:@"ag", @"sdfg", @"dgh", nil] retain];
NSArray *newArr = [[arr mutableCopy] retain];
[arr release];
[newArr release];
newArr = [NSArray arrayWithObject:@"sdfdhs"];

每行后会保留多少?请向我解释一下。感谢你......

1 个答案:

答案 0 :(得分:1)

保留计数几乎没用,请参阅http://whentouseretaincounts.com了解原因。

但是,我在您的代码中添加了对retainCount的调用并运行了以下内容:

NSArray *arr = [[NSArray arrayWithObjects:@"ag", @"sdfg", @"dgh", nil] retain];
NSLog(@"%ld", [arr retainCount]);

NSArray *newArr = [[arr mutableCopy] retain];
NSLog(@"%ld", [newArr retainCount]);

[arr release];
NSLog(@"%ld", [arr retainCount]);

[newArr release];
NSLog(@"%ld", [newArr retainCount]);

newArr = [NSArray arrayWithObject:@"sdfdhs"];
NSLog(@"%ld", [newArr retainCount]);

并得到以下结果:

2013-01-24 15:45:56.840 Untitled 2[96774:707] 2 
2013-01-24 15:45:56.842 Untitled 2[96774:707] 2 
2013-01-24 15:45:56.842 Untitled 2[96774:707] 1 
2013-01-24 15:45:56.843 Untitled 2[96774:707] 1 
2013-01-24 15:45:56.843 Untitled 2[96774:707] 1

第一个结果是2而不是1,因为来自arrayWithObjects的返回值已被自动释放但尚未实际释放,因为尚未刷新自动释放池(此通常发生在事件循环中。)

第二个结果是2,因为mutableCopy返回了一个保留的对象,我们再次retain

第三个结果是1,因为我们发布的arr保留计数为2。仍然没有刷新自动释放池。

第四个结果是1,因为我们发布的newArr保留计数为2

最终结果是1,因为我们泄露了newArr的内容,并为变量分配了一个新的自动释放数组。保留计数1是尚未自动释放的计数。

但是,保留计数不应该被信任。了解内存管理规则(无论您是否使用ARC)。