什么自动保留和释放?

时间:2011-06-16 20:00:33

标签: objective-c reference-counting

我有点理解自动保留和释放的内容,但我找不到任何关于此的官方数据,我认为我出了点问题。

  1. 设置使用@property(retain)声明的属性将保留并释放旧值,但不会在没有self.的情况下将属性设置在同一对象中
  2. 方法内的所有对象(包括参数)在创建/传递时保留,并在方法返回时释放。
  3. 方法返回的对象不会被释放,而是由其返回的方法释放,因为它在方法中的局部变量。
  4. 我弄错了什么/忘了什么? 当回报被丢弃时会发生什么?比如[object someMethodThatReturnsAnObject];。它返回的方法不是本地的,所以我不确定它是否会被释放,xCode会对它发出警告。

3 个答案:

答案 0 :(得分:3)

而不是猜测,read the documentation。这是确定的。

  

设置声明的属性   与@property(保留)将保留和   释放旧值,但不设置   同一对象内的属性   没有自我。

排序。没有“没有自己设置财产”。那就是直接设置一个实例变量。

  

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

都能跟得上;看文档。

  

方法返回的对象   不会被释放,而是会发布   由它返回的方法释放   因为它的局部变量在里面   方法

完全没有;看文档。

答案 1 :(得分:2)

  

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

调用为retain属性合成的setter方法将释放旧值并保留新值。直接设置ivar而不通过你的访问器,除了分配ivar之外什么都不做。它既不会保留也不会释放任何东西。 self.foo = bar 完全 [self setFoo:bar]。无论setFoo:将做什么(setFoo:的合成保留版本如上所述起作用)。 foo = bar 完全 foo = bar

  

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

这根本不是真的。他们既没有保留也没有被释放。保留和释放不会神奇地发生。这是为了响应一方面调用allocnewcopyretain而另一方面调用release。使用点表示法只是方法调用的简写,其内部可能有retain

  

方法返回的对象不会被释放,而是由其返回的方法释放,因为它在方法中的局部变量。

事实并非如此。方法返回的对象既不会保留也不会释放。按照惯例,名称中包含allocnewcopy的方法将返回净+1保留。任何其他方法都将返回net 0 retain-count(对象上将保留尽可能多的自动释放)。 “当前”保留计数将始终大于0,否则无法返回对象。 (这是对事实的轻微描述。如果有私人保留,任何一种情况下的保留计数都可能大于1.但从调用者的角度来看,这是一种有用的思考方式。)

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

答案 2 :(得分:1)

“自动”一词有点可怕。这意味着保留和释放在某种程度上被幕后的运行时神奇地应用。真的,保留的唯一时间是发送包含以下内容之一的消息: Alloc < / em> 保留 复制 (NARC)。它被释放的唯一时间是发送消息或自动释放消息。那么您真正需要了解的是,这些方法在什么情况下被发送?

<强> 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.的属性”实际上只是直接的ivar赋值。由于没有使用点运算符,因此没有调用任何方法,因此您知道不会保留任何内容。

<强> 2。 3.与方法范围有关的事情?
这些都不是真的。惯例说,变量返回我的方法没有名称中的NARC痕迹将被自动释放。这是方法作者实际遵循惯例。由于方法调用,不会自动保留或释放任何内容。