好的,最近我得到了这个可能的坏习惯,用@property
声明我的类属性,用@synthesize
创建getter和setter,只需在self.name
我需要的地方使用它们而不必对内部ivar的引用(让@synthesize
做它的工作)
现在,当然这不允许我访问内部的ivar(例如name_
)但是从我到目前为止编码的内容来看,我并不是真的需要它。对于只读属性,我不使用@synthesize
,而是自己实现getter。
一切似乎都很好,但不知怎的,我觉得这是不对的,因为我已经查看了所有开源库,也宣告了ivar并在整个代码中使用它。 @property
+ @synthesize
并且没有ivar它绝对是懒惰的选择,但有什么缺点?有人可以给我一些建议吗?
另外,我已经读过,作为一般建议,除了self.propertyName
和dealloc
方法之外,可以在类代码中的任何位置使用init
。但只要你确保对象是初始化的:
-(id) init
{
if( (self=[super init] )) {
}
return self;
}
并且在调用[super dealloc]
之前删除所有键值观察者一切都应该没问题。正确?
答案 0 :(得分:5)
好@synthesize
将创建内部ivar,其名称与属性相同:
@synthesize name;
- (void) dealloc {
[name release], name = nil;
[super dealloc]
}
或者给内部ivar另一个名字:
@synthesize name = _name;
- (void) dealloc {
[_name release], _name = nil;
[super dealloc]
}
我在init中使用self.name
但在dealloc中没有使用{似乎效果很好。
答案 1 :(得分:5)
归结为您要为哪个版本的Objective-c运行时构建:Modern or Legacy。
现代版支持“声明属性的实例变量合成”。即。您无需为每个@property
定义实例变量。运行时将负责为您创建一个。默认情况下,ivar的名称与@property
相同。您可以使用格式@synthesize propertyName = iVarName;
旧版本不支持ivar合成,因此您必须定义一个用于存储@property
的ivar。
Mac OS X v10.5及更高版本上的iPhone应用程序和64位程序使用现代版本的运行时。您应该假设每个其他平台都使用旧版本。
有什么缺点?嗯,最大的一个是可移植性 - 通过不定义ivars,您的代码可以在更少的平台上运行,例如它不适用于OSX 10.4。你也失去了一些控制/灵活性和可能会无意间遇到与子& amp;超级班。
请务必记住,deallocate properties that you have synthesized应@synthesize
。属性不会自动释放 - 您应该release
任何未标记为assign
的合成属性(不要释放任何标记为assign的属性)。
N.B。如需额外的功劳,您可以整理您的只读房产。没有理由编写自己的访问者而不使用@synthesize
。只需将您的房产定义为只读和可选择调用getter @property(getter=isIntReadOnlyGetter, readonly)