0

我的问题看起来像十几个关于释放属性的问题,但我找不到我正在寻找的确切答案。

当使用 retain 声明属性时:

@property (nonatomic, retain) NSString * myString;

然后

@synthesize myString;

它生成具有保留和释放操作的 getter 和 setter。好的。

当然,必须在 dealloc 中释放属性。

-(void)dealloc {
    [myString release];
    myString = nil;
    [super dealloc];
}

所以这很干净。

但是如果我从不使用 myString 怎么办?它是预初始化的吗?我的观点是 myString 保留计数为 0。但是在 dealloc 中释放 myString 会减少它并使应用程序崩溃?但它不会崩溃!

是一种更清洁的释放方式吗?

if(myString != nil) {
    [myString release];
    myString = nil;
}
4

4 回答 4

2

您缺少的关键是您可以向 nil 发送消息。所以不,你的后一种方法并不干净,只是不必要的。

如果你从不使用 myString,它不会被初始化为任何东西。它仍然为零。当你释放它时,你实际上是在做[nil release]——实际上并没有做任何事情。因此没有崩溃。

于 2012-02-29T10:02:02.523 回答
1

您可以在objective-c 中向nil 对象发送释放消息,这样什么都不会发生。我的意思是应用程序不会崩溃。当在多线程环境中使用对象时,将对象设置为 nil 的想法很方便,因为使用多个线程,您不能总是保证实例变量只会在它被释放之前被读取。

于 2012-02-29T10:07:51.637 回答
1

没有必要检查它是否是nil。如果您将版本发送到一个nil对象,什么都不会发生,那么为什么要检查。

创建对象实例时,nil除非您在任何 init 方法中对其进行初始化,否则该属性将设置为。

这与您在方法中创建的变量不同,它们可能指向无效内存。因此将这些设置nil为安全的方法。这不是属性所必需的。

于 2012-02-29T10:02:27.027 回答
0

如果您正在使用@property(retain/copy)&@synthesize则无需检查nil. 它不会崩溃或抛出EXC_BAD_ACCESS

否则,如果你不使用它,你必须检查变量是否是nil,否则如果变量是 ,它会崩溃nil

于 2012-02-29T10:48:42.917 回答