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



我看到过代码示例(来自《开始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的访问器

"作为读/写属性的一切"是有根本缺陷的。

相关内容

  • 没有找到相关文章

最新更新