2014-12-03 54 views
6

我在UITableView的头文件中发现了这个属性,并且几乎每个属性都是非弧样式,尽管我的项目正在使用ARC。为什么UITableView的委托属性的属性很弱

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

为什么苹果不使用的,而不是assignweak属性,它是对非弧形向后兼容?如果是这样,为什么不使用__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较弱,所以我不需要当委托实例被释放委托设置为零。

感谢您的帮助。

编辑:

我注意到,__has_feature(objc_arc)是错误的,因为我可以使用ARC时,我的部署目标为4.3,但后来我不能使用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 
+0

请参阅我的解释:http://stackoverflow.com/a/24469143/341994它不是“向后兼容非ARC”;它不是ARC。 – matt 2014-12-04 01:20:39

+0

@matt非常感谢。你认为苹果公司使用'#if__IPHONE_OS_VERSION_MIN_REQUIRED> = __IPHONE_5_0'来提供更好的支持ARC的Cocoa会更好吗?或者很难做到这一点。 – KudoCC 2014-12-04 01:32:55

+1

可可的这些部分都很陈旧。他们不会很快改变。他们在ARC之前多年。他们是他们。继续。 – matt 2014-12-04 01:58:35

回答

4

为什么苹果不使用weak property而不是赋值,它对于非弧的后向兼容性?

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

+0

您说__weak与assign修饰符是同义词,但是当我使用assign时,在委托实例被释放之后,代理将不会像__weak修饰符那样设置为nil。 – KudoCC 2014-12-03 09:14:39

+0

是的,先生,这是真的。已更新,您是否按照链接和说明进行操作。你会理清原因。 – 2014-12-03 09:24:06

+0

谢谢,我会在稍后看到链接:) – KudoCC 2014-12-03 09:25:55

0

注意,当你有一个委托,它的分配,这使得该委托值始终设置为每当对象将被释放零很重要 - 这样的对象应该非常小心以零出代表在dealloc中引用它是否在其他地方没有这样做。

因此,如果您尝试使用该对象,则会在释放对象(指向内存不再分配给期望的对象类型)后导致任何引用left set,将无效。调试器中的一个标志是调试器声称某些变量的类型与实际声明的变量完全错误。

这可能是由于这个原因“为什么不是的UITableView的委托财产弱 的属性“

希望这可以帮助你。