可以不申报ivar但是用于合成?

时间:2011-11-05 00:26:26

标签: iphone objective-c

我正在查看一些示例代码,我对特定ivar缺乏声明感到困惑。希望有人可以帮助我更好地理解这一点:

typedef NSUInteger (^NumberOfItemsInSection)(ViewClass *viewClass, NSUInteger section);

// class declaration    
@interface SampleScrollView : UIScrollView
@property (nonatomic, copy) NumberOfItemsInSection itemsSectionBlock;
@end

// class implementation
@implementation SampleScrollView

@synthesize itemsSectionBlock = _itemsSectionBlock;

- (void)setItemsSectionBlock:(NumberOfItemsInSection)itemsSectionBlock
{
    // _itemsSectionBlock is not declared any where in the class 
    // How does the compiler not complain?

    _itemsSectionBlock = [itemsSectionBlock copy];
    [self reloadData];
}

@end

实例变量“_itemsSectionBlock”未在任何地方声明,它只能在属性的setter覆盖中使用。这有什么作用?

1 个答案:

答案 0 :(得分:1)

它是现代运行时的一部分,并减少了代码的重复 - 声明iVars,然后为那些iVars声明属性。

@synthesize

为您处理

现代运行时允许您执行其他您认为以前无法​​执行的操作。例如,您现在可以将.m文件中的iVars声明为类扩展的一部分,这样可以减少在公共接口中公开的信息量。

<强>更新

现代LLVM 4编译器甚至可以让您取消@sytnthesize行。如果您声明一个属性,它将为您自动合成,它甚至会创建一个带有前导下划线的后备存储。