【发布时间】:2011-07-22 04:48:11
【问题描述】:
我在观看 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
请注意在 @implementation 指令之后声明的实例变量。
现在让我感到惊讶的是,实例变量实际上可以在实现文件中声明,而不是静态变量。我的问题如下:
- 这是在适用于 iOS 5 的 SDK 中引入的一些新结构,还是这种情况已经存在很长时间了?
- 如果实例变量不能在对象外部访问,那么在实现中声明实例变量是否是一种好习惯?这似乎比使用 @private 指令更干净。
【问题讨论】:
-
你有一个完整的、可编译的例子吗?
-
以上代码在 iOS 5 SDK 下应该可以正常编译。
-
在类扩展中添加 iVar 怎么样?
-
@OscarGomez 尝试在扩展中声明 ivars 在当前版本的带有 Clang 的 Xcode 中会出现错误:“实例变量可能未放置在类扩展中”。这是以前允许的吗?
-
@Danra 我在网上查了一下,好像因为某些奇怪的原因它只能在 iOS 上运行。
标签: objective-c automatic-ref-counting