当通过类方法获取一个对象时,为什么在返回值之前,该方法可以将值放入AutoReleasePool中?

时间:2014-10-24 04:50:09

标签: ios objective-c cocoa memory-management automatic-ref-counting

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:在两种方式之间使用哪种更好(更快,更有效)?为什么?

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