(有人请编辑标题,显然我还不太擅长术语)
假设我有一个名为 DataRequester
的对象,其工作是创建一个NSURLConnection
并成为其委托。我从根视图控制器实例化对象,并提供一个回调块(这是 DataRequester
的属性)。当NSURLConnection
完成加载后,我调用回调并将NSData
作为参数传入。
现在,在定义了完成块的根视图控制器中,我想将NSData
存储在根视图控制器的属性NSData (strong,nonatomic) *responseData
中。我的问题是,在回调中我应该使用
weakSelf.responseData = [NSData dataWithData:passedInData];
或者我可以简单地使用:
weakSelf.responseData = passedInData;
(其中RootViewController * __weak weakSelf = self)
该项目也使用 ARC。
对正确答案的简要解释将不胜感激,并帮助我了解如何管理记忆(我已经做了很多阅读,但一个实际的例子/解释对我来说会有很长的路要走)。
我会使用copy
属性:
NSData (copy,nonatomic) *responseData;
// Then weakSelf.responseData = passedInData;
当 copy
属性是指向也具有可变子类的类的指针时,建议使用 属性,以避免对象在您不知道的情况下发生变异的情况。例如,假设有另一个类保存指向此数据对象的指针,并且它是可变的。它可能在您不知道的情况下被其他类更改。
如果属性是 readonly
,则无需复制它,并且您确定它指向不可变对象。但是,向不可变对象发送复制消息并不昂贵:它返回对象本身。