在ObjC实现文件中声明的实例变量

Wol*_*urs 47 objective-c automatic-ref-counting

我正在观看WWDC ARC介绍视频,在看到一个Apple工程师谈到Stack示例之前,我看到过ObjC中从未见过的东西.

以下代码用于ARC的堆栈示例:

@implementation Stack 
{ 
    // instance variable declared in implementation context
    NSMutableArray *_array; 
}

- (id)init 
{
   if (self = [super init])
      _array = [NSMutableArray array];
   return self;
}

- (void)push:(id)x 
{
   [_array addObject:x];
}

- (id)pop 
{
   id x = [_array lastObject];
   [_array removeLastObject];
   return x;
}

@end
Run Code Online (Sandbox Code Playgroud)

请注意在@implementation指令之后声明的实例变量.

现在让我感到惊讶的是,实际变量实际上可以在实现文件中声明,而不是静态变量.我的问题如下:

  • 这是SDK for iOS 5中引入的一些新构造还是已经可以使用很长时间了?
  • 如果不在对象外部访问实例变量,那么在实现中声明实例变量是不错的做法?它似乎比使用@private指令更清洁.

Sea*_*ell 40

这确实是一种新的语言特性,如果你必须声明你的ivars(而不是简单地声明属性并让编译器为你生成ivars),这是一个很好的做法.理论上你的头文件应该只暴露你的类的公共接口; 其他一切都属于实现.

需要注意的是,实现文件ivars对于子类是不可见的,如果您手动生成了需要子类化的setter和getter,这有时会有点尴尬.

  • 这与在扩展中声明ivars(即`@interface MyClass(){...}`)相比如何?它还允许您不在标头中声明ivars. (9认同)

小智 18

在实现中声明iVars肯定是目标C中的新构造.您需要使用xcode4.2并在构建设置中选择LLVM编译器.我们的想法是让您的头文件更清晰.你可以在花括号中列出你的ivars,就像这个例子;

@implementation MyClass {    
  int var1;
  int var2;
}
Run Code Online (Sandbox Code Playgroud)

Rahul给出的答案并不是真的正确,尽管你可以通过编译器将变量视为静态的方式来推断变量.可能对于他使用它们的情况并不重要.