委托属性声明中的“弱”和“赋值”有什么区别


87

这有什么区别:

@property (nonatomic, weak) id  <SubClassDelegate> delegate; 

还有这个:

@property (nonatomic, assign) id  <SubClassDelegate> delegate; 

我想将属性用于代表。

Answers:


153

weak和之间的唯一区别assign是,如果weak释放了属性所指向的对象,则weak指针的值将设置为nil,这样您就永远不会冒访问垃圾的风险。如果使用assign,则不会发生,因此,如果从您下面释放该对象并尝试访问它,则将访问垃圾。

对于Objective-C对象,如果您在可以使用的环境中weak,则应该使用它。


16
您知道为什么某些Cocoa Touch框架类仍在使用委托分配吗?例如,仍然分配UISearchDisplayController的委托。为什么没有更新?
Pwner 2014年

@Pwner似乎在iOS 8.0中已弃用
Stavash 2015年

这里有一个非过时的例子:即使UITableViewassign其代表:@property (nonatomic, assign) id <UITableViewDelegate> delegate;
克里斯Nolet

3
@ChrisNolet因为可能他们在内部仍在使用MRC(手动参考计数)。
Marco Sero 2015年

2
到目前为止,UITableView的委托示例为:@property(非原子,弱,可为空)id <UITableViewDelegate>委托;因此,这不再是有效的示例。
sdoowhsoj
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.