【问题标题】:Releasing a (nonatomic, retain) synthetized property释放(非原子,保留)综合属性
【发布时间】:2012-03-18 19:20:55
【问题描述】:

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

当一个属性用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;
}

【问题讨论】:

    标签: iphone memory-management properties retaincount


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        无需检查是否为nil。 如果您将版本发送到 nil 对象,则什么也不会发生,那么为什么要检查。

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

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-03-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多