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

每行之后将保留什么计数?请给我解释一下。感谢您...

4

1 回答 1

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因为 from 的返回值arrayWithObjects已经被自动释放但实际上还没有被释放,因为自动释放池还没有被刷新(这通常发生在事件循环中)。

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

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

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

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

但是,不应信任保留计数。学习内存管理规则(无论你是否使用 ARC)。

于 2013-01-24T07:55:35.450 回答