Ios iPhone内存管理的模糊场景

Ios iPhone内存管理的模糊场景,ios,memory-management,properties,dealloc,Ios,Memory Management,Properties,Dealloc,我很难理解这种情况 我创建一个对象 我将其保留属性设置为 我忘了释放它的财产 我释放这个物体 由于我没有在dealloc方法中释放属性,该场景会导致内存泄漏还是会自动释放该属性?是的,它是泄漏 保留,alloc将使计数器增加1。 释放将减少计数器。 当计数器达到零时,它将释放内存 把塞特想象成这样: [newvalue retain]; [property release]; property = newvalue; 所以 创建一个对象=>0+1=1 将其指定给某个对象作为保留属性=>

我很难理解这种情况

  • 我创建一个对象
  • 我将其保留属性设置为
  • 我忘了释放它的财产
  • 我释放这个物体
由于我没有在dealloc方法中释放属性,该场景会导致内存泄漏还是会自动释放该属性?

是的,它是泄漏

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

把塞特想象成这样:

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

  • 创建一个对象=>0+1=1
  • 将其指定给某个对象作为保留属性=>1+1=2
  • 释放对象=>2-1=1
您必须在某个时候再次释放该对象。
而且,相信我,autorelease在iphone环境中运行得不太好。

Cocoa的工作方式是,在任何一种方法中,内存管理看起来总是局部平衡的*。这就是重点。通过查看某个方法,您应该能够判断该方法中是否存在泄漏或错误。不需要全球计划知识

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

如果您这样做:

[obj setProp:foo];
释放foo是你的责任吗?否-参见规则。如果obj保留了它(你是说你碰巧知道它保留了),那么obj就有责任释放它,如果不是更早的话,可以使用dealloc方法

所以,如果你这样做了,它是平衡的,不管什么类型的属性
-prop

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

*除了init、copy、dealoc和accessor方法的实现之外。

这是不正确的,autorelease确实可以在iPhone上工作。对于少量的autorelease对象,这是可以的。但是,我仍然建议你应该避免使用它。您可以在dealloc func中释放该属性,因为
[nil release]
不会给您带来任何麻烦。