我正在查看一些示例代码,我对特定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覆盖中使用。这有什么作用?
答案 0 :(得分:1)
它是现代运行时的一部分,并减少了代码的重复 - 声明iVars,然后为那些iVars声明属性。
由@synthesize
现代运行时允许您执行其他您认为以前无法执行的操作。例如,您现在可以将.m文件中的iVars声明为类扩展的一部分,这样可以减少在公共接口中公开的信息量。
<强>更新强>
现代LLVM 4编译器甚至可以让您取消@sytnthesize行。如果您声明一个属性,它将为您自动合成,它甚至会创建一个带有前导下划线的后备存储。