【问题标题】:Alloc initWithString vs retainAlloc initWithString vs 保留
【发布时间】:2013-01-06 05:50:55
【问题描述】:

以下两行之间有什么区别从内存的角度

NSString *dbFilePath =[[NSString alloc]initWithString:[[NSBundle mainBundle] pathForResource:dbName ofType:nil]];

  NSString *dbFilePath =[[[NSBundle mainBundle] pathForResource:dbName ofType:nil] retain]; 

"[NSString alloc]initWithString:" 或者只是“保留”

提前致谢

【问题讨论】:

    标签: objective-c ios memory-management


    【解决方案1】:

    实际上,没有区别。但是,在第一种情况下,您暂时比第二种情况下多了一个 NSString 对象,即 pathForResource 返回的对象将在不久之后自动释放,并且它是幸存的副本。

    在第二种情况下,不进行复制。而是直接保留pathForResource 返回的对象。高峰期少一个物体。

    我发现第二段代码更直接。

    但是,我想知道为什么要保留从堆栈中引用的东西。我希望dbFilePath 更持久,比如成员变量。

    【讨论】:

    • 关于便利构造函数返回自动释放对象的规则是 MRC 的过时构造。通过构造函数返回的所有对象都是隐式强对象,重要的是您对它们的存储。
    • 谢谢,@CodaFi。答案来自生活在 MRC 世界的人。
    • 你是说你从网站上的其他地方提出这个答案,还是你指的是你自己;)
    • 指我自己。但是你让我很好奇,也许你可以详细说明你的评论。这个问题在我看来与 MRC 相关。
    • 在这种特殊情况下您可能不必担心它,但一般来说,当您“获得所有权”时,您应该 -copy 具有值类型语义的对象而不是 -retain 它们其中。您可能会收到一个NSMutableString,随后可能会被返回给您的对象改变。不可变对象通过调用retain 实现-copyWithZone:,以便仅在必要时进行复制。
    猜你喜欢
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多