我有点理解自动保留和释放的内容,但我找不到任何关于此的官方数据,我认为我出了点问题。
self.
的情况下将属性设置在同一对象中我弄错了什么/忘了什么?
当回报被丢弃时会发生什么?比如[object someMethodThatReturnsAnObject];
。它返回的方法不是本地的,所以我不确定它是否会被释放,xCode会对它发出警告。
答案 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
。
方法内的所有对象(包括参数)在创建/传递时保留,并在方法返回时释放。
这根本不是真的。他们既没有保留也没有被释放。保留和释放不会神奇地发生。这是为了响应一方面调用alloc
,new
,copy
,retain
而另一方面调用release
。使用点表示法只是方法调用的简写,其内部可能有retain
。
方法返回的对象不会被释放,而是由其返回的方法释放,因为它在方法中的局部变量。
事实并非如此。方法返回的对象既不会保留也不会释放。按照惯例,名称中包含alloc
,new
或copy
的方法将返回净+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痕迹将被自动释放。这是方法作者实际遵循惯例。由于方法调用,不会自动保留或释放任何内容。