在委托属性声明中,“weak”和“assign”有什么区别?

90
这有什么区别:
@property (nonatomic, weak) id  <SubClassDelegate> delegate; 

还有这个:

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

我想要使用委托的属性。

1个回答

156
weakassign的唯一区别在于,如果一个weak属性指向的对象被释放,那么weak指针的值将被设置为nil,这样你就永远不会访问到垃圾数据。如果你使用assign,那么这种情况就不会发生,如果对象被释放并且你尝试访问它,你将访问到垃圾数据。
对于Objective-C对象,如果您可以使用weak,则应该使用它。

16
你知道为什么一些Cocoa Touch框架类仍然在委托中使用assign吗?例如,UISearchDisplayController的委托仍然是assign。为什么它从未更新过? - Pwner
@Pwner 在 iOS 8.0 中似乎已被弃用。 - Stavash
这里有一个非废弃的示例:即使是 UITableView 也为其委托提供了 assign@property (nonatomic, assign) id <UITableViewDelegate> delegate; - Chris Nolet
3
可能是因为他们仍在内部使用手动引用计数(MRC)。 - Marco Sero
3
截至今天,UITableView的代理示例现在是:@property (nonatomic, weak, nullable) id <UITableViewDelegate> delegate; 因此,先前提及的示例已不再适用。 - sdoowhsoj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接