【问题标题】:iOS: When to assign & when to create new copy of objects being assigned to a propertyiOS:何时分配以及何时创建分配给属性的对象的新副本
【发布时间】:2013-09-11 17:53:03
【问题描述】:

(有人请编辑标题,显然我还不太会行话)

所以,假设我有一个名为 DataRequester 的对象,它的工作是创建一个 NSURLConnection 并成为它的代表。我从我的根视图控制器实例化对象,并提供一个回调块(这是DataRequester 的属性)。当NSURLConnection 完成加载后,我调用回调并将NSData 作为参数传入。

现在,在定义完成块的根视图控制器中,我想将NSData 存储在根视图控制器的属性NSData (strong,nonatomic) *responseData 中。我的问题是,在回调中我应该使用

weakSelf.responseData = [NSData dataWithData:passedInData]; 

或者我可以简单地使用:

 weakSelf.responseData = passedInData;

(其中RootViewController * __weak weakSelf = self) 项目也使用ARC。

对正确答案的简要解释将不胜感激,并帮助我了解内存是如何管理的(我已经阅读了大量内容,但一个实际的示例/解释对我来说有很长的路要走)。

【问题讨论】:

  • 我通过了澄清标题,@JoshDG;你怎么看?
  • 完美。我很感激 :) 我认为这是一个重要的问题,人们可能会在没有意识到的情况下挣扎。希望现在可以找到它!

标签: ios objective-c cocoa-touch properties automatic-ref-counting


【解决方案1】:

我会使用copy 属性:

NSData (copy,nonatomic) *responseData;  
// Then weakSelf.responseData = passedInData;

copy 属性是当该属性是指向具有可变子类的类的指针时建议使用的,以避免在您不知道的情况下您的对象发生变异的情况。例如,假设有另一个类持有指向该数据对象的指针,并且它是可变的。它可能会在您不知道的情况下被其他班级更改。

如果属性是readonly,则不需要复制它,并且您确定它指向一个不可变对象。然而,向不可变对象发送复制消息并不昂贵:它返回对象本身。

【讨论】:

    猜你喜欢
    • 2017-03-19
    • 1970-01-01
    • 2012-04-07
    • 2014-04-05
    • 2010-11-15
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多