Objective-c现代运行时在接口块中使用属性和ivars

Pet*_*rbo 8 iphone properties objective-c instance-variables modern-runtime

我已经看过代码示例(来自"初学iPhone 4开发"一书),它们都在接口块中声明了ivars,然后声明了相同的属性.像这样:

@interface ViewController : UIViewController {
    UITableView *table;
}

@property (nonatomic, retain) IBOutlet UITableView *table;
Run Code Online (Sandbox Code Playgroud)

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

干杯,

彼得

Nik*_*uhe 5

明确声明ivars使您可以在内部使用ivar的专用类型.

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

例:

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

@implementation
{
    NSMutableArray *bars;
}

@synthesize bars;

- (void)addBar:(Bar *)bar
{
    [bars addObject:bar];
}
@end
Run Code Online (Sandbox Code Playgroud)

当然,从bars属性返回的对象并不是真正不可变的.但重点是API并未揭示其可变性.

请注意,我使用了新的私有ivars-in-implementation样式.它取决于现代运行时以及clang编译器.