【问题标题】:setter and getter methodssetter 和 getter 方法
【发布时间】:2011-04-14 09:30:55
【问题描述】:

我知道您使用 @synthesize 创建 setter 和 getter 方法,这使事情变得更容易,因为您不必自己编写。

在某些地方,您必须使用 self.property 而不仅仅是 property,才能使用 setter 和 getter 方法,例如在 dealloc 和 initWithCoder 中。

这告诉我,这些 setter 和 getter 方法除了使您更容易设置和获取变量之外,还做了其他重要的事情。他们在做什么以及他们是如何做到的?

【问题讨论】:

    标签: objective-c cocoa-touch setter getter


    【解决方案1】:

    他们正在做你在@property 声明或你自己的实现中告诉他们做的任何事情,如果你选择编写一个。大多数情况下,使用访问器而不是直接修改实例变量的原因是为了避免内存泄漏。想象一个用

    声明的NSString实例变量
    @property (nonatomic, retain) NSString *myString;
    @synthesize myString;
    

    当您想要更改对象的 myString 属性时,这些行会生成正确调用 releaseretain 的访问器。如果您没有调用访问器,则可能会泄漏旧值,除非您自己小心地进行内存管理。

    【讨论】:

      【解决方案2】:

      你的基本戒律:

      在某些地方你必须使用 self.property 而不是 只是属性,以便使用 setter 和 getter 方法,例如 在 dealloc 和 initWithCoder 中。

      这告诉我这些 setter 和 getter 方法正在做某事 否则很重要...

      不太正确。这里的区别在于,使用 self.propertyname 在该类中使用时会专门调用 getter/setter,而直接使用 propertyname 则不会——它直接访问实例变量。

      Per @Carl 良好的做​​法是,您绝对可以在任何地方使用 getter/setter 序列,因为这样可以确保您不会错过内存管理的极端情况。

      【讨论】:

        【解决方案3】:

        我赞同@heckj 和@Carl 所说的,但必须再补充一点。

        一般initdealloc 中使用访问器是安全的。问题是您的类可能是子类,访问器可能会被覆盖。然后这些访问器可能会访问您的类或子类的其他属性。这可能会导致崩溃:

        • init 的情况下,这些还没有被初始化(因为在init 你做的第一个调用是[super init])。
        • dealloc 的情况下,这些已经被释放(因为在dealloc 中,您最后一次调用是[super dealloc])。

        在实践中可以initdealloc 中使用访问器。在两个前提下:

        • 你知道你在做什么。 (见上文)
        • 您可以控制所有可能继承的代码。 (不适用于框架等)

        【讨论】:

          猜你喜欢
          • 2017-09-09
          • 2017-08-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-09
          • 2012-06-23
          相关资源
          最近更新 更多