我看到过代码示例(来自《开始iPhone4开发》一书),它们都在接口块内声明ivar,然后声明相同的属性。像这样:
@interface ViewController : UIViewController {
UITableView *table;
}
@property (nonatomic, retain) IBOutlet UITableView *table;
这样做的目的/好处是什么?据我所知,对于现代运行时版本(iPhone和64位OSX应用程序),您只需要声明属性,就可以省去在接口块内声明ivar。根据类似线程中的这个答案,这将用于调试目的。但是,除了调试之外,使用这种方法还有其他好处吗?
干杯,
Peter
通过显式声明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并没有显示出它的可变性。
注意,我在实现风格上使用了新奇的私有ivar。这取决于现代运行时以及clang编译器。
一些程序员喜欢用稍微不同的名称来定义他们的iVar,以区分直接访问和KVC访问。例如:
在.h 中
@interface ViewController : UIViewController {
UITableView *_table;
}
@property (nonatomic, retain) IBOutlet UITableView *table;
并且在.m 中
@synthesize table = _table;
通过这种方式,您可以使用_table
直接访问iVar,但使用[self table]
使用合成的setter和getter
但是,除了调试之外,使用这种方法还有其他好处吗?
我明确声明ivar用于:
- 访问控制(可见性)
- 组织
- 统一的书写风格
- 兼容性(嘿,这个程序一天可以支持32位)
- 因为我将属性作为类公共接口的一部分进行关联(尽管存在例外),而不仅仅是作为类ivar的访问器
"作为读/写属性的一切"是有根本缺陷的。