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