我在看WWDC ARC介绍视频时,看到了一些我在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

Please note the instance variable declared right after the 100 directive.

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

  • 这是iOS 5 SDK中引入的某种新构造,还是已经存在很长时间了?
  • 如果不在对象外部访问实例变量,那么在实现中声明实例变量是否是一种良好的做法?它似乎比@private指令的使用更干净.

推荐答案

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

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

Objective-c相关问答推荐

iPhone 可达性判断

Objective C中的简单字符串连接

如何在 iOS Objective-C 头文件中将函数标记为已弃用?

indexOfObject 对比indexOfObjectIdenticalTo

更改 UIBarButtonItem 的 Tint colored颜色

在 Cocoa 中你更喜欢 NSInteger 还是 int,为什么?

未找到 RKObjectMapping.h

在我的 iOS Mail 和 Safari 应用程序中支持 Open In... 菜单项

如何确定 UICollectionView flowLayout 中单元格之间的间距

UICollectionView 单元格 Select 和单元格重用

如何在 Objective-C 中将 NSString 解析为 BOOL?

如何逐行从 NSFileHandle 读取数据?

从 URL Objective C 获取图像

如何检测 NSString 是否为空?

嵌入自定义容器视图控制器时,内容位于导航栏下方.

Objective C 中的对象分配和初始化

获取临时目录中文件的文件路径和 URL

为什么 detailTextLabel 不可见?

如何配置我的应用程序 - 菜单项被禁用?

UITableViewCell中的文本居中对齐问题