【问题标题】:How are @"Strings" allocated in memory?@"Strings" 是如何在内存中分配的?
【发布时间】:2010-12-14 04:55:29
【问题描述】:

我很好奇以下代码的内存分配。

NSString *myString = [NSString string];

我知道这会创建一个自动释放的空字符串,@""

当我打电话时会发生什么

myString = @"Hello world";

我的引用是否与提供的自动释放对象 NSString 相同,还是我只是分配了一个我负责释放的新对象?

【问题讨论】:

    标签: objective-c cocoa memory-management


    【解决方案1】:

    当你想知道你是否拥有一件物品时,问问自己:

    我用来创建这个对象的方法...

    • new开头?
    • alloc开头?
    • 包含copy?
    • 等于retain?

    如果您可以对其中任何一个回答“是”,那么您有责任在返回的对象上调用 releaseautorelease。 (请注意,Core Foundation 对象的规则略有不同。另请注意,文档明确说明与此相矛盾的任何内容都会获胜。文档始终取代指南)

    就您的字符串而言,您所有问题的答案都是“否”,因此您不对对象负责。常量字符串(@"foo" 风格)被硬编码到应用程序二进制文件中,不能被释放。然而,这是一个实现细节。只要你遵守内存管理规则,你就可以了!

    【讨论】:

    • 最近看了一篇非常不错的关于内存管理的文章goo.gl/Tp8WW希望能帮助你更好的理解。
    • 谢谢,我对 Cocoa 内存管理非常满意,只是对硬编码字符串的工作方式有点困惑。
    • @Flash84x:防止释放的实现细节是常量字符串的保留计数为 INT_MAX。这被运行时视为特殊情况,并将retainrelease 变为无操作。
    猜你喜欢
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 2013-10-03
    相关资源
    最近更新 更多