2010-04-07 102 views
0

我对理解这种情况有些困难。iPhone内存管理的模糊场景

  • 我创建了一个对象
  • 我所保留的属性设置为东西
  • 我忘记释放其财产
  • 我释放对象

,因为我没有松开财产在dealloc方法中,场景会导致内存泄漏还是会自动释放该属性?

回答

-1

是的,它是泄漏。

保留,alloc将增加一个计数器。 释放将减少计数器。 当计数器达到零时,它将释放内存。

思考设定器中,这样:

[newvalue retain]; 
[property release]; 
property = newvalue; 

所以..

  • 创建一个对象=> 0 + 1 = 1
  • 其分配给一些对象作为保留属性=> 1 + 1 = 2
  • 释放对象=> 2-1 = 1

您将不得不再次释放该对象。 而且,相信我autorelease在iphone环境下工作不太好。

+1

这是不正确的,autorelease的确在iPhone上工作。 – Ken 2010-04-07 09:08:10

+0

少量的自动释放对象可以。但是,我仍然建议你应该避免使用它。 你可以在dealloc func 中释放属性,因为'[nil release]'不会给你带来任何麻烦。 – Bird 2010-04-07 09:38:13

0

可可的工作方式是内存管理总是在本地看起来平衡,在任何一个方法*。这是一个重点。通过查看这种方法,您应该能够判断出方法中是否存在泄漏或错误。没有全球程序知识要求。

如果您从-copy,-alloc,-retain或-new方法接收到对象,则您有责任释放对象。

如果你这样做:

[obj setProp:foo]; 

是你的责任,以释放富?否 - 查看规则。如果obj保留它(并且你说你碰巧知道它的确如此),那么obj有责任在它的dealloc方法中释放它,如果不是更早的话。

所以,如果你这样做,它是平衡的,不管是什么样的财产-prop是。

id obj = [[MyObject alloc] init]; 
[obj setProp:foo]; 
[obj release]; 

*除了在init,copy,dealloc和accessor方法的实现中。