释放(非原子,保留)合成属性

时间:2012-02-29 09:52:00

标签: iphone memory-management properties retaincount

我的问题看起来像是关于发布属性的十几个,但我找不到我正在搜索的确切答案。

使用retain:

声明属性时
@property (nonatomic, retain) NSString * myString;

然后

@synthesize myString;

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

当然,必须以dealloc释放财产。

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

所以这很干净。

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

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

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

4 个答案:

答案 0 :(得分:2)

你缺少的关键是你可以发送消息给零。所以不,你的后一种方法不是更清洁,只是不必要。

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

答案 1 :(得分:1)

没有必要检查它是nil。 如果您将版本发送到nil对象没有任何反应,那么为什么要检查。

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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