e.g。
方法1:
-(void)method1{
id array1 = [[NSMutableArray alloc] init];//now,retainCount of array1 is 1
}
方法2:
-(void)method2{
id array2 = [NSMutableArray array]; //now,retainCount of array2 is 2
}
问题1:
Int方法2,类Method + array的实现不使用[alloc [init]]?但是为什么它没有直接返回值?并将值放在AutoReleasePoll中?
问题2:在两种方式之间使用哪种更好(更快,更有效)?为什么?
答案 0 :(得分:0)
这两个陈述都是等价的,第二个陈述实际上并未添加array1
的保留计数。使用第一种方法,您的函数将承担所有权,并随后负责以后的任何发布调用,但使用ARC,您不必担心这些细节。
在ARC之前的日子里,方法返回的值将被放入自动释放池中,以避免过早释放和内存泄漏。请考虑以下情况:
-(NSArray *)emptyArray {
// create return value with calls to alloc and init.
NSArray *returnArray = [[NSArray alloc] init];
return returnArray;
}
因为没有调用[returnArray release];此方法返回的值永远不会被释放,因此会出现内存泄漏。起初看起来似乎没有直接解决方案。
-(NSArray *)emptyArray {
NSArray *returnArray = [[NSArray alloc] init];
return returnArray;
[returnArray release]; // unreachable statement
}
和
-(NSArray *)emptyArray {
// create return value with calls to alloc and init.
NSArray *returnArray = [[NSArray alloc] init];
[returnArray release];
return returnArray; // will return deallocated object
}
因此,我们将数组添加到自动释放池中,以便在一段时间后释放它 - 足够长,以便接收返回值的任何内容保留它,但最终仍能防止任何内存泄漏。
答案 1 :(得分:0)
如果您使用ARC,则无需使用任何材料。两者都是一样的。
如果您不使用ARC,对于method1,您必须自己调用release,方法2是自动释放的对象。
[NSMutableArray array] = [[[NSMutableArray alloc] init] autorelease] // Both having same retain count = 1