我的问题看起来像是关于发布属性的十几个,但我找不到我正在搜索的确切答案。
使用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;
}
答案 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
则变量会崩溃。