2011-10-26 89 views
0

示例代码:释放返回的对象还是我必须使用自动释放

- (Foo*)createFoo { 
    Foo *foo = [[Foo alloc] init]; 
    return foo; 
} 

- (void)someOtherMethod { 
    Foo *foo; 
    foo = [self createFoo]; //retain count 1 
    [foo release]; //retain count = 0 => object gets released? 

    //repeat 
    foo = [self createFoo]; 
    [foo release]; 
} 

Qeustion(可能是愚蠢的一个):我必须在createFoo自动释放或者我可以释放someOtherMethod返回的对象?

+0

我想你正在调用[self createFoo]而不是[self Foo],然后可以在其他方法中释放它。请记住,ARC可以让你摆脱几乎所有的问题...... –

+1

@ilMalvagioDottorProsciutto虽然我同意ARC的评论,但我认为应该如何手动完成它是很好的,除了ARC只是把这些调用无论如何,知道它在做什么是非常好的。 –

+0

@SimonLee完全是我的想法 – peko

回答

0

当您将所有权移交给调用代码时,此实例中的代码应该自动释放您的对象,您不再希望在方法内负责,因此您应该放弃对其的保留。

记住NARC - 与这些关键字开始被假定为不自动释放方法...

新,分配,保留,复制

如果你的方法被命名为newFoocopyFoo那么你的代码上面会罚款没有autoreleasing。

+0

所以没有什么会出错,如果将app的代码要求重命名为newFoo的createFoo? – peko

+0

是的,这很好,否则自动释放,然后将其保留在调用代码中,并在完成时释放。 –

0

可可内存管理其实很简单,因为每个人都坚持一套规则。你没有遵循这些规则,所以你会遇到麻烦。

阅读Basic Memory Management Rules。如果你坚持遵守这些规则,你应该没问题。

相关问题