NSArray *arr = [[NSArray arrayWithObjects:@"ag", @"sdfg", @"dgh", nil] retain];
NSArray *newArr = [[arr mutableCopy] retain];
[arr release];
[newArr release];
newArr = [NSArray arrayWithObject:@"sdfdhs"];
每行之后将保留什么计数?请给我解释一下。感谢您...
NSArray *arr = [[NSArray arrayWithObjects:@"ag", @"sdfg", @"dgh", nil] retain];
NSArray *newArr = [[arr mutableCopy] retain];
[arr release];
[newArr release];
newArr = [NSArray arrayWithObject:@"sdfdhs"];
每行之后将保留什么计数?请给我解释一下。感谢您...
保留计数几乎没有用,有关原因的详细信息,请参阅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)。