我知道您使用@synthesize来创建setter和getter方法,这样可以使事情变得更容易,因为您不必自己编写。
在某些地方你必须使用self.property而不仅仅是属性才能使用setter和getter方法,例如在dealloc和initWithCoder中。
这告诉我这些setter和getter方法正在做一些重要的事情,除了让你更容易设置和获取变量。他们在做什么以及他们是如何做到的?
答案 0 :(得分:5)
如果您选择写一个,他们会在@property
语句或您自己的实现中执行您告诉他们要做的任何事情。通常,使用访问器而不是直接修改实例变量的原因是为了避免内存泄漏。想象一下使用
NSString
实例变量
@property (nonatomic, retain) NSString *myString;
@synthesize myString;
当您想要更改对象的release
属性时,这些行会生成一个正确调用retain
和myString
的访问者。如果您没有调用访问者,则可能会泄漏旧值,除非您自己小心进行内存管理。
答案 1 :(得分:3)
你的基本规则:
在某些地方你必须使用self.property而不是 只是属性才能使用setter和getter方法,比如 在dealloc和initWithCoder中。
这告诉我这些setter和getter方法正在做些什么 否则这很重要......
不太正确。这里的区别在于,使用self.propertyname在该类中使用时专门调用getter / setter,而直接使用propertyname则不会直接访问实例变量。
Per @Carl良好的做法是你可以在任何地方使用getter / setter序列,因为这样可以避免错过内存管理的极端情况。
答案 2 :(得分:2)
我的第二个是@heckj和@Carl所说的,但必须再加一点。
一般在init
或dealloc
中使用访问者 是安全的。问题是您的类可能是子类,可能会覆盖访问器。然后,这些访问器可能会访问您的类或子类的其他属性。这可能会导致崩溃:
init
这些尚未初始化(因为在init
,您要做的第一个电话是[super init]
)。dealloc
这些已经被释放(因为在dealloc
,您执行的最后一次通话是[super dealloc]
)。 在实践中,您可以在init
和dealloc
中使用访问者。在两个前提下: