使用@property和@synthesize进行ivar隐式创建

时间:2011-08-02 12:38:53

标签: iphone objective-c ipad

好的,最近我得到了这个可能的坏习惯,用@property声明我的类属性,用@synthesize创建getter和setter,只需在self.name我需要的地方使用它们而不必对内部ivar的引用(让@synthesize做它的工作)

现在,当然这不允许我访问内部的ivar(例如name_)但是从我到目前为止编码的内容来看,我并不是真的需要它。对于只读属性,我不使用@synthesize,而是自己实现getter。

一切似乎都很好,但不知怎的,我觉得这是不对的,因为我已经查看了所有开源库,也宣告了ivar并在整个代码中使用它。 @property + @synthesize并且没有ivar它绝对是懒惰的选择,但有什么缺点?有人可以给我一些建议吗?

另外,我已经读过,作为一般建议,除了self.propertyNamedealloc方法之外,可以在类代码中的任何位置使用init。但只要你确保对象是初始化的:

-(id) init
{
    if( (self=[super init] )) {

    }
    return self;
}

并且在调用[super dealloc]之前删除所有键值观察者一切都应该没问题。正确?

2 个答案:

答案 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名称
  • 旧版本不支持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)

的内容