【问题标题】:Setting Default Values For NSString Properties为 NSString 属性设置默认值
【发布时间】:2010-11-24 06:29:13
【问题描述】:

我正在尝试确定为 NSString 属性设置默认值的推荐方法。

我知道在类的 init 和 dealloc 方法中使用访问器方法是不安全的。我经常有我想分配默认值的字符串常量。这样做的推荐方法是什么(考虑到 iVar 将在 dealloc 方法中释放)?

例如,我理解以下是不安全的:

@property (nonatomic, copy) NSString *identifier;
....

- (id) init
{ 
    self = [super initWithLayer:displayLayer];

    if (self != nil)
    {
        self.identifier = @"fireSpell01";
    }

    return self;
}

可以吗,还是推荐这样做:

identifier = [@"fireSpell01" retain];

或者我必须这样做:

identifier = [[NSString stringWithString:@"fireSpell01"] retain];

【问题讨论】:

    标签: objective-c nsstring init


    【解决方案1】:

    这样做:

    identifier = @"fireSpell01";
    

    不需要retain 字符串。字符串常量在程序的整个生命周期中都存在,永远不需要保留或释放。做[[NSString stringWithString:@"fireSpell01"] retain] 只会创建一个不必要的副本并且毫无意义。

    您要避免在initdealloc 方法中使用属性设置器。因为 setter 可能具有依赖于某些状态值的副作用,所以您不想在部分构造/部分破坏的对象上调用它们。在init 期间直接分配给 ivars 并跳过设置器会好得多。

    【讨论】:

    • 按照您的建议直接分配标识符时(在 dealloc 期间)调用释放是否可以?
    • @Jay 是的。在字符串常量上调用retainrelease 是安全的。否则就没有意义——接收NSString* 的方法不知道它是如何分配的,并且必须能够以同样的方式对待它。
    猜你喜欢
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多