setter和getter方法

时间:2010-09-19 18:11:07

标签: objective-c cocoa-touch setter getter

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

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

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

3 个答案:

答案 0 :(得分:5)

如果您选择写一个,他们会在@property语句或您自己的实现中执行您告诉他们要做的任何事情。通常,使用访问器而不是直接修改实例变量的原因是为了避免内存泄漏。想象一下使用

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

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

答案 1 :(得分:3)

你的基本规则:

  

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

     

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

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

Per @Carl良好的做法是你可以在任何地方使用getter / setter序列,因为这样可以避免错过内存管理的极端情况。

答案 2 :(得分:2)

我的第二个是@heckj和@Carl所说的,但必须再加一点。

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

  • 如果init这些尚未初始化(因为在init,您要做的第一个电话是[super init])。
  • 如果dealloc这些已经被释放(因为在dealloc,您执行的最后一次通话是[super dealloc])。

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

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