8

我看过代码示例(来自《开始 iPhone 4 开发》一书),它们都在接口块内声明 ivars,然后声明相同的属性。像这样:

@interface ViewController : UIViewController {
    UITableView *table;
}

@property (nonatomic, retain) IBOutlet UITableView *table;

这样做的目的/好处是什么?据我了解,对于现代运行时版本(iPhone 和 64 位 OS X 应用程序),您只需要声明属性并且可以省略在接口块内声明 ivars。根据类似线程中的这个答案,它将用于调试目的。但是除了调试之外,您会使用这种方法还有其他好处吗?

干杯,

彼得

4

3 回答 3

5

显式声明 ivar 使您可以在内部为 ivar 使用专用类型。

一个典型的例子是一个内部可变的对象,可以从外部以只读、不可变的方式访问。

例子:

@interface Foo : NSObject
@property (readonly) NSArray *bars;
@end

@implementation
{
    NSMutableArray *bars;
}

@synthesize bars;

- (void)addBar:(Bar *)bar
{
    [bars addObject:bar];
}
@end

当然,从bars属性返回的对象并不是真正不可变的。但关键是 API 并没有揭示其可变性。

请注意,我使用了新奇的 private-ivars-in-implementation 风格。它取决于现代运行时以及 clang 编译器。

于 2011-05-23T16:33:04.063 回答
2

一些程序员喜欢用稍微不同的名称来定义他们的 iVar,以区分直接访问和 KVC 访问。例如:

在.h

@interface ViewController : UIViewController {
    UITableView *_table;
}

@property (nonatomic, retain) IBOutlet UITableView *table;

在.m

@synthesize table = _table;

这样,您可以使用直接访问 iVar,_table但使用合成的 setter 和 getter[self table]

于 2011-05-23T16:37:31.120 回答
1

但是除了调试之外,您会使用这种方法还有其他好处吗?

我明确声明 ivars 用于:

  • 访问控制(可见性)
  • 组织
  • 统一的书写风格
  • 兼容性(嘿,这个程序一天可以支持32位)
  • 并且因为我将属性关联为类公共接口的一部分(尽管存在例外) - 而不仅仅是作为类 ivars 的访问器。

“一切都是读/写属性”从根本上是有缺陷的。

于 2011-05-23T19:57:12.917 回答