关于iOs内存管理的新手问题

时间:2011-08-05 07:10:18

标签: iphone ios memory-management

如何在这种情况下正确写作:

我有一些返回NSMutableArray *的方法。因为方法不是用init,new或alloc启动的,所以如何写入apple内存管理指南,我返回自动审批对象。

-(NSMutableArray*)someMethod {

    NSMutableArray *array = [NSMutableArray alloc] init] autorealese];
    //Some code here
    return array;
}

我还有另外一种方法,称之为:

-(NSMutableArray*)method1 {
     NSMutableArray *array = nil;
     if(condition){
         array = [self someMethod];
     }
     return array;
}

-(NSMutableArray*)method2 {
     NSMutableArray *array = nil;
     array = [self method1];
}

代码工作。但是XCode分析工具说在method2中我得到了一个计数为0的对象。那么,如何编写这段代码呢?

2 个答案:

答案 0 :(得分:1)

除了method2将返回自动释放的数组之外,您的代码没有任何问题。因此,无论调用此方法,都应保留返回值。

答案 1 :(得分:0)

创建一个自动释放的NSMutableArray并返回它。

-(NSMutableArray*)someMethod {

        NSMutableArray *array = [NSMutableArray alloc] init] autorealese];
        //Some code here
        return array;
    }

Method1使用someMethod中的autorelease NSMutableArray,并且在Method1的生命周期中,数组不会被自动释放。这是Objective-c中的内存管理规则之一,对象通过方法循环生存。

-(NSMutableArray*)method1 {
     NSMutableArray *array = nil;
     if(condition){
         array = [self someMethod];
     }
     return array;
}

Method2使用仍然等待来自method1的自动释放的NSMutableArray。重要的是要注意b / c你在method2中有条件,数组可能是nil。

-(NSMutableArray*)method2 {
     NSMutableArray *array = nil;
     array = [self method1];
}

换句话说,你沿着你的方法传递自动释放的对象。这没什么不对。你只需要记住,如果你想存储method2的值,你需要保留它,否则它将被自动释放。

由于你在method1中的条件,分析器会抱怨b / c不能保证method1会返回一个对象,有可能返回nil。