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

时间:2011-05-23 15:52:47

标签: iphone objective-c properties instance-variables modern-runtime

我见过代码示例(来自“初学iPhone 4开发”一书),他们都在界面块中声明了ivars,然后声明了相同的属性。像这样:

@interface ViewController : UIViewController {
    UITableView *table;
}

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

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

干杯,

彼得

3 个答案:

答案 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]

来使用合成的setter和getter

答案 2 :(得分:1)

  

但除了调试之外还有其他任何好处吗?你会使用这种方法吗?

我明确声明了ivars:

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

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