0

IOS setter 中的常见做法如下:

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

相反,这不是好的做法

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

在第一种情况下检查平等的原因是什么?秒的情况下有什么问题?

4

3 回答 3

2

如果你在[object setMyString:[object myString]];不检查相等的情况下设置这样的东西 - 它会崩溃!因为它会在你发送消息之前被释放。(如果只有对象自己的字符串)。同样在第一个示例中,我们检查相等性以避免额外的操作。

于 2012-09-28T14:26:09.277 回答
0

您可以将其用于内存管理,https://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/

于 2012-09-28T14:50:02.733 回答
0

我知道这有点多余,但是...

如果新对象和旧对象相同,那么您发送release给旧对象并且它被释放,指向新对象的指针将成为一个悬空指针,因为它指向的对象将不再存在(因为它指向同一个对象作为旧的对象指针)。前任。如果myStringnewString指向保留计数为 1 的同一实例,则减去 1,它将等于 0。现在添加一个为时已晚,因为它会被释放。retain但是,反转对and的调用release应该没问题。如果保留计数为 1,而您添加了 1,则现在为 2,您可以安全地发送 release。一般来说,我会说,在你放弃一个对象之前,先声明对新对象的所有权。

此外,第一种类型的设置器将是您将用于retain/strong样式设置器的类型。如果是这样,assign您就不需要保留/释放,因为不应该断言所有权。NSStrings 通常有一个copy样式设置器,它复制参数并使用它,这将创建一个副本而不是保留。我通常会使用copy任何具有可变子类的东西,因为你不希望有人传入 NSMutableString 并在你背后改变它。此页面进入访问器,您会注意到它们在释放旧值之前保留了新值,并解释了原因。

于 2012-09-28T17:34:51.027 回答