【问题标题】:Using properties to access iVars in init?在 init 中使用属性访问 iVar?
【发布时间】:2010-11-03 19:53:22
【问题描述】:

这是上一个问题的一个分支,这是不好的做法(使用属性设置 iVars)吗?

// Designated initializer 001
- (id)initWithName:(NSString *)newName andType:(NSString *)newType {
    self = [super init];
    if(self) {
        [self setName:newName];
        [self setType:newType];
    }
    return self;
}

或者我应该使用...

// Designated initializer 002
- (id)initWithName:(NSString *)newName andType:(NSString *)newType {
    self = [super init];
    if(self) {
        name = [newName retain];
        type = [newType retain];
    }
    return self;
}

我一直在使用 001 版,但被引导相信在 init 或 dealloc 中使用属性访问 iVar 是不好的做法。

编辑:retain添加到版本002

加里。

【问题讨论】:

    标签: iphone objective-c cocoa-touch


    【解决方案1】:

    是的,Apple discourages 在 init 或 dealloc 中使用访问器,因为它们可能会产生副作用,而不仅仅是设置实例变量。在未初始化或已销毁的对象中,这些显然是不可取的。

    文档中的准确引用:“唯一不应该使用访问器方法设置实例变量的地方是 init 方法和 dealloc。”

    【讨论】:

    • 谢谢 Chuck,所以你会选择 002 版吗?
    • @fuzzygoat:理想情况下,这些应该是copy 属性,并且 init 方法应该复制而不是保留(因为它们是字符串),否则,是的,我会使用版本 2。
    • @JustinXXVII:我编辑了帖子,并带有指向包含建议的确切页面的链接,所以你不必相信我。它在内存管理编程指南中,我强烈推荐给所有想要为 Apple 平台编写代码的人。
    • 我投票删除了我的答案,它仍然出现,是因为它被投票否决了吗?
    • 只是好奇,这些副作用是什么?
    猜你喜欢
    • 2012-09-25
    • 2014-09-27
    • 1970-01-01
    • 2012-06-24
    • 2012-11-23
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 2012-12-07
    相关资源
    最近更新 更多