我见过代码示例(来自“初学iPhone 4开发”一书),他们都在界面块中声明了ivars,然后声明了相同的属性。像这样:
@interface ViewController : UIViewController {
UITableView *table;
}
@property (nonatomic, retain) IBOutlet UITableView *table;
这会是什么目的/好处?据我所知,使用现代运行时版本(iPhone和64位OS X应用程序),您只需要声明属性,并且可以省略声明接口块内的ivars。根据{{3}}在similair线程中的答案,它将用于调试目的。但除了调试之外还有其他任何好处吗?你会使用这种方法吗?
干杯,
彼得
答案 0 :(得分:5)
明确声明ivars使您可以在内部使用ivar的专用类型。
一个典型的例子是一个内部可变对象,可以以只读,不可变的方式从外部访问。
示例:
@interface Foo : NSObject
@property (readonly) NSArray *bars;
@end
@implementation
{
NSMutableArray *bars;
}
@synthesize bars;
- (void)addBar:(Bar *)bar
{
[bars addObject:bar];
}
@end
当然,从bars
属性返回的对象并不是真正不可变的。但重点是API并未揭示其可变性。
请注意,我使用了新的私有ivars-in-implementation样式。它取决于现代运行时以及clang编译器。
答案 1 :(得分:2)
一些程序员喜欢定义名称略有不同的iVars,以区分直接访问和KVC访问。例如:
中的.h
@interface ViewController : UIViewController {
UITableView *_table;
}
@property (nonatomic, retain) IBOutlet UITableView *table;
和.m
@synthesize table = _table;
这样您就可以使用_table
直接访问iVar,但是使用[self table]
答案 2 :(得分:1)
但除了调试之外还有其他任何好处吗?你会使用这种方法吗?
我明确声明了ivars:
“作为读/写属性的一切”从根本上是有缺陷的ood。