【问题标题】: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 属性时,这些行会生成正确调用 release 和 retain 的访问器。如果您没有调用访问器,则可能会泄漏旧值,除非您自己小心地进行内存管理。
【解决方案2】:
你的基本戒律:
在某些地方你必须使用 self.property 而不是
只是属性,以便使用 setter 和 getter 方法,例如
在 dealloc 和 initWithCoder 中。
这告诉我这些 setter 和 getter 方法正在做某事
否则很重要...
不太正确。这里的区别在于,使用 self.propertyname 在该类中使用时会专门调用 getter/setter,而直接使用 propertyname 则不会——它直接访问实例变量。
Per @Carl 良好的做法是,您绝对可以在任何地方使用 getter/setter 序列,因为这样可以确保您不会错过内存管理的极端情况。
【解决方案3】:
我赞同@heckj 和@Carl 所说的,但必须再补充一点。
一般在init 或dealloc 中使用访问器是不安全的。问题是您的类可能是子类,访问器可能会被覆盖。然后这些访问器可能会访问您的类或子类的其他属性。这可能会导致崩溃:
- 在
init 的情况下,这些还没有被初始化(因为在init 你做的第一个调用是[super init])。
- 在
dealloc 的情况下,这些已经被释放(因为在dealloc 中,您最后一次调用是[super dealloc])。
在实践中您可以在init 和dealloc 中使用访问器。在两个前提下:
- 你知道你在做什么。 (见上文)
- 您可以控制所有可能继承的代码。 (不适用于框架等)