为什么UITableView的委托属性的属性不强

时间:2014-12-03 06:51:12

标签: ios objective-c

我在UITableView的头文件中找到了这个,虽然我的项目使用ARC,但几乎每个属性都是非弧形的。

@property (nonatomic, assign)   id <UITableViewDataSource> dataSource;
@property (nonatomic, assign)   id <UITableViewDelegate>   delegate;

为什么Apple不使用weak属性而不是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

2 个答案:

答案 0 :(得分:4)

为什么Apple不使用weak property代替分配,它是非弧的向后兼容性吗?

我做了一些research and found,__ weak与“assign”修饰符同义。但唯一的区别在于分配委托实例在取消分配时不会设置为nil。您通常为IBOutlets和委托使用assign修饰符。在ARC下,它被__weak替换。但是,有一个警告。 __weak要求您在支持归零弱引用的运行时上部署应用程序。这包括,&gt; =(iOS 5和Lion)。 Snow Leopard或iOS 4及更早版本的操作系统不支持清零弱引用。这显然意味着如果您计划部署到较旧的操作系统,则无法使用__weak所有权修饰符。是的,在这个敏感的情况下,它是非弧的向后兼容性。

答案 1 :(得分:0)

请注意,当您拥有一个赋值的委托时,每当要释放该对象时始终将该委托值设置为nil非常重要 - 因此对象应始终小心地在dealloc中取消委托引用它没有在其他地方这样做过。

因此,在释放对象(指向内存不再分配给预期的对象类型)后,分配委托,任何引用左集都将无效 - 因此如果您尝试使用它会导致崩溃。调试器中的一个标志是当调试器声称某个变量的类型看起来完全错误时,变量实际被声明为。

这可能是“为什么UITableView的委托属性的属性不弱的原因 “

希望这对你有所帮助。