代码之家  ›  专栏  ›  技术社区  ›  nicerobot

当一个财产存在时,ivar的目的是什么?

  •  19
  • nicerobot  · 技术社区  · 15 年前

    下面的代码在编译和运行时都不会抱怨no name 伊瓦尔。那么,为什么看到ivar如此普遍呢 @property/@synthesize .

    @interface PropTest : NSObject
    {
    }
    @property (retain) NSString *name;
    @end
    
    @implementation PropTest
    @synthesize name;
    @end
    
    int main (int argc, const char * argv[]) {
      NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
      PropTest *p = [[PropTest new] autorelease];
      p.name = @"Hello, World!";
      NSLog(@"%@",p.name);
      [pool drain];
      return 0;
    }
    

    此代码打印

    Hello, World!
    

    事实上,如果我 p->name ,我得到一个警告:

    warning: instance variable 'name' is @private; this will be a hard error in the future
    

    这表示如果一个ivar不存在的话,就会为我创建一个ivar。

    如果这是真的,那么手动创建ivar有什么意义呢(忽略一个显而易见的事实,即有时不使用g/setter访问器是有正当理由的)?

    或者换个角度问,我应该吗 只有永远

    3 回复  |  直到 12 年前
        1
  •  19
  •   shosti    14 年前

        2
  •  8
  •   Chuck    15 年前

    eman的回答总体上是正确的,但是即使在新的运行时,仍然有一个理由声明ivar:Apple不鼓励在init和dealloc方法中使用合成的访问器。本质上,getter和setter除了设置变量外,还允许有副作用。特别是,它们可以触发KVO通知。有了ivar,你就可以 release 就这样吧。但是,如果您只有一个属性,那么您唯一的选择就是设置它,并希望您避免任何不幸的交互。

    老实说,我不确定这在实践中有多大问题。我只是迷信地避开了它,尽管我私下里怀疑它在大多数情况下会引起问题。但苹果在文档中确实指出了这一点,所以我想这是有原因的。

        3
  •  7
  •   Community Mohan Dere    9 年前

    有两个不太好但必要的理由来确保房产得到IVAR的支持:

    1. 在我看来,在某些情况下使用@property而不使用ivar可能会隐藏其他ivar,从而导致编译错误(参见 Why does a subclass @property with no corresponding ivar hide superclass ivars? )

    除非我弄错了这里的几个词条,否则我认为在没有显式ivar的情况下使用@property可能会导致不便之处。