2011-06-16 92 views
1

我很清楚自动保留和发布的内容,但是我找不到任何有关这方面的官方数据,并且我认为我弄错了一些东西。什么会自动保留和发布?

  1. 设置被声明用@property(保留)属性将保留和释放旧的值,但没有self.
  2. 不设置相同的对象内的特性的方法(包括参数)内的所有对象都保留当方法返回时创建/传递并释放。
  3. 一个方法返回的对象不会被释放,而是会被它返回的方法释放,因为它的方法内部是局部变量。

我弄错了什么/忘记了什么吗?
退货被丢弃时会发生什么?像[object someMethodThatReturnsAnObject];。它不会返回到它的方法的本地,所以我不确定它是否会被释放,并且xCode会警告它。

回答

3

而不是猜测,read the documentation。这是明确的。该声明 与@财产(保留)将保留和释放 旧值

设置属性,但没有自我没有设置相同的对象 内 属性。

的排序。没有“没有自我设置财产”。这是直接设置一个实例变量。

的方法(包括 参数)内的所有对象时,创建/传递和 方法返回时释放 被保留。

都能跟得上;看文档。

,其由方法 返回将不被释放,而是一个目的将 通过该方法被释放其由于 方法内它的本地变量返回 到。

完全没有;看文档。

2

使用@property(retain)声明的设置属性将保留并释放旧值,但不会在没有self的情况下设置同一对象内的属性。

调用为保留属性合成的setter方法将释放旧值并保留新值。直接设置伊娃而不通过您的访问者,只会分配伊娃。它既不保留也不释放任何东西。 self.foo = bar正好是[self setFoo:bar]。无论什么setFoo:都会完成(合成的保留版本setFoo:如上所述工作)。 foo = bar正好是foo = bar

当方法返回时,方法内的所有对象(包括参数)在创建/传递时被保留。

这根本不是真的。他们既不被保留也不被释放。保持和释放不会神奇地发生。它发生在响应一方面要求alloc,new,copy,retain而另一方面要求release。使用点符号只是一个方法调用的简写,其中可能有一个retain

一个方法返回的对象不会被释放,而是会被它返回的方法释放,因为它的方法内部是局部变量。

这是不正确的。方法返回的对象既不会被保留也不会被释放。按照惯例,在名称中使用allocnewcopy的方法将返回一个净+1保留。任何其他方法都会返回一个净0保留计数(对于保留,对象上的自动释放量将尽可能多)。 “当前”保留计数将始终大于0,否则无法返回对象。 (这是对事实的轻微说明,如果有私人保留,这两种情况下的保留数都可能大于1,但从调用者的角度来看,这是一种考虑它的有用方法。)

最好看的地方是Practical Memory Management,这一切都非常简洁。内存管理编程指南的其余部分将给出更多示例。

1

术语“自动”有点可怕。这意味着保留和释放以某种方式由幕后运行时神奇地应用。真的真的,唯一一次的东西保留时,为它发送包含以下内容的消息:的Alloc保留复制(N.A.R.C)。唯一一次发布的时候是发送释放消息或自动释放消息。所以你真正需要了解的是,在什么情况下发送这些方法?

1.设置属性
你是对的,只要你去了。为什么?因为属性只是用于生成getter和setter方法的语法糖。例如,self.myString = @"Foo";[self setMyString:@"Foo"]完全相同。你需要了解的是,当你声明与保留语义的性质,实际上是因为像这样的方法:

- (void)setMyString:(NSString *)newString { 
    if (newString != myString) { 
     [myString release]; 
     myString = [newString retain]; 
    } 
} 

因此,很明显,他说self.myString = someOtherString将导致保留新值。你所说的“设置不带self.的财产”实际上只是直接的伊娃分配。由于没有使用点运算符,因此没有调用方法,因此您知道没有保留任何方法。

2.和3.与方法范围有关的事情?
这些都不是真的。约定表示变量返回了我的方法,但没有名称中的NARC痕迹将被自动释放。这是方法作者实际遵循惯例。就像方法调用的结果一样,任何事情都不会自动保留或释放。

+2

请注意,您提供的方法在原则上是正确的,但永远不会如何正确执行setter。你写它的方式,如果newString == myString,并且你最后保留了它,那么它会在你保留它并崩溃之前释放它。您必须保留之前保留,autorelease之前保留,或检查相等。我个人在发布之前使用保留。 – 2011-06-16 20:28:14

+0

@Rob,绝对。我正在寻找一个尽可能简化的例子,以避免分散注意力。澄清可能是一个好主意。 – 2011-06-16 20:30:30

+0

由于我们都同意这是个好主意,我为您澄清了代码。 :-) – 2011-06-16 23:43:53