我在UITableView的头文件中发现了这一点,尽管我的项目使用的是ARC,但几乎每个属性都是非弧形的。
@property (nonatomic, assign) id <UITableViewDataSource> dataSource;
@property (nonatomic, assign) id <UITableViewDelegate> delegate;
为什么Apple不使用weak
property而不是property assign
,它是非弧形的向后兼容性吗?如果是这样,为什么不使用它__has_feature(objc_arc)
来区分ARC和非ARC。
#if __has_feature(objc_arc)
@property (nonatomic, weak) id <UITableViewDataSource> dataSource;
@property (nonatomic, weak) id <UITableViewDelegate> delegate;
#else
@property (nonatomic, assign) id <UITableViewDataSource> dataSource;
@property (nonatomic, assign) id <UITableViewDelegate> delegate;
#endif
我希望delegate
它很弱,所以当委托实例被释放时,我不需要将委托设置为nil。
谢谢你的帮助。
编辑:
我注意到这__has_feature(objc_arc)
是错误的,因为当我的部署目标是4.3时我可以使用ARC,但是之后我就不能使用weak
。因此,条件应该是我的部署目标是否等于或大于5.0。
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_5_0
@property (nonatomic, weak) id <UITableViewDataSource> dataSource;
@property (nonatomic, weak) id <UITableViewDelegate> delegate;
#else
@property (nonatomic, assign) id <UITableViewDataSource> dataSource;
@property (nonatomic, assign) id <UITableViewDelegate> delegate;
#endif
为什么苹果不使用weak property
而不是分配,这是非弧形的向后兼容性吗?
我进行了一些研究,发现__weak是“赋值”修饰符的同义词。但是唯一的区别是在分配时,委托实例在释放时不会设置为nil。通常,您对IBOutlets和委托使用Assign修饰符。在ARC下,此值将替换为__weak。但是,有一个警告。__weak要求您在支持零弱引用的运行时上部署应用程序。这包括> =(iOS 5和Lion)。Snow Leopard或iOS 4及更早版本的操作系统不支持归零弱引用。显然,这意味着如果计划部署到较早的操作系统,则不能使用__weak所有权修饰符。所以是的,在这种敏感性下,它是非弧形的向后兼容性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句