委托属性声明中'weak'和'assign'之间的区别是什么

Fir*_*ous 85 delegates properties objective-c ios ios5

这有什么区别:

@property (nonatomic, weak) id  <SubClassDelegate> delegate; 
Run Code Online (Sandbox Code Playgroud)

还有这个:

@property (nonatomic, assign) id  <SubClassDelegate> delegate; 
Run Code Online (Sandbox Code Playgroud)

我想为代表使用属性.

yuj*_*uji 152

weak和之间的唯一区别assign是,如果weak属性指向的对象被释放,那么weak指针的值将被设置为nil,这样您就不会冒着访问垃圾的风险.如果您使用assign,那将不会发生,因此如果对象从您下面取消分配并且您尝试访问它,您将访问垃圾.

对于Objective-C对象,如果您处于可以使用的环境中weak,那么您应该使用它.

  • 你知道为什么一些Cocoa Touch框架类仍然使用assign for delegates吗?例如,[UISearchDisplayController]的代表(https://developer.apple.com/library/ios/documentation/UIKit/Reference/UISearchDisplayController_Class/Reference/Reference.html#//apple_ref/occ/instp/UISearchDisplayController/delegate)仍然是分配.为什么不更新? (16认同)
  • @ChrisNolet因为他们可能仍在内部使用MRC(手动引用计数). (3认同)
  • 截至今天,UITableView的委托的例子现在是:@property(非原子,弱,可空)id <UITableViewDelegate>委托; 所以这不再是一个有效的例子. (2认同)