iOS:何时分配以及何时创建分配给属性的对象的新副本



(有人请编辑标题,显然我还不太擅长术语)

假设我有一个名为 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 ,则无需复制它,并且您确定它指向不可变对象。但是,向不可变对象发送复制消息并不昂贵:它返回对象本身。

最新更新