术语“自动”有点可怕。这意味着保留和释放以某种方式由幕后运行时神奇地应用。真的真的,唯一一次的东西保留时,为它发送包含以下内容的消息:新的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痕迹将被自动释放。这是方法作者实际遵循惯例。就像方法调用的结果一样,任何事情都不会自动保留或释放。
请注意,您提供的方法在原则上是正确的,但永远不会如何正确执行setter。你写它的方式,如果newString == myString,并且你最后保留了它,那么它会在你保留它并崩溃之前释放它。您必须保留之前保留,autorelease之前保留,或检查相等。我个人在发布之前使用保留。 – 2011-06-16 20:28:14
@Rob,绝对。我正在寻找一个尽可能简化的例子,以避免分散注意力。澄清可能是一个好主意。 – 2011-06-16 20:30:30
由于我们都同意这是个好主意,我为您澄清了代码。 :-) – 2011-06-16 23:43:53