【问题标题】:iVar property, access via self?iVar 财产,通过自我访问?
【发布时间】:2010-11-03 15:39:10
【问题描述】:

我知道在访问属性的 setter / getter 方法时,我应该使用 [self setThisValue:@"a"]; 而不是 thisValue = @"a"; 但是通过下面的示例,我可以看到添加自我文档,我正在向 iVar 属性发送消息而不是不是局部作用域的变量,但在这种情况下它还有什么作用吗?

@interface CustomController : UIViewController {
    NSMutableArray *foundList;
}
@property(nonatomic, retain) NSMutableArray *foundList;
@end

.

[[self foundList] addObject:eachObject]; // I usually write this ...

[foundList addObject:eachObject];

加里。

【问题讨论】:

    标签: iphone objective-c cocoa-touch


    【解决方案1】:

    如果您为 ivar 定义了属性,则应该使用它而不是直接访问 ivar。这允许子类覆盖 setter/getter 并做一些与仅从 ivar 获取值不同的事情。

    唯一的例外是 init 方法和 dealloc。

    【讨论】:

    • 感谢您的回复,嗯,这很有趣,我总是为诸如 initWithSize:(int)newSize 之类的对象编写自定义初始化,并且在实现中我使用 [self setSize: newSize];这不是好习惯吗? ...
    • 这不是推荐的做法。问题是一个子类可能已经覆盖了 setSize: 并且该方法可能依赖于子类的 init 已经完成。
    【解决方案2】:

    使用

    [[self foundArray] addObject:eachObject];
    

    您只需对 getter 方法添加额外的调用,我认为在大多数情况下这是不必要的。另一方面,除非您实现自己的自定义 getter 并在那里做一些奇怪的事情,否则此构造的开销非常小,因此在实践中,我认为这只是样式问题。 (我个人不会在这里使用属性)

    【讨论】:

      【解决方案3】:

      如果您曾经子类化,或者让其他人重用您的代码并且他们想要覆盖您的功能,那么访问器方法非常方便。

      【讨论】:

        【解决方案4】:

        使用 self.ivar 也有一些内存清理问题。尤其是您保留了其他阶级拥有的财产。然后你得到任何新对象并想要更改对 self.ivar = newObject 的引用。如果您不使用 self.ivar,则当 newObject 也归他人所有时,它的访问权限可能会很差。 默认设置器检查引用,如果不是 nil,则释放旧值并将新 ivar 设置为其新值。 我今天使用没有没有自我的对象,陷入了这个问题。 总之,如果对象是共享的,使用 self.ivar ...

        【讨论】:

          猜你喜欢
          • 2012-06-24
          • 1970-01-01
          • 2014-09-27
          • 1970-01-01
          • 2016-03-12
          • 2016-02-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多