【问题标题】:Memory leak from static NSString来自静态 NSString 的内存泄漏
【发布时间】:2011-04-20 00:55:36
【问题描述】:

我是第一次使用 Objective C 程序员。我一直在阅读其他人的代码,并且经常看到创建了静态字符串但从未发布过。以此为例:

- (UITableViewCell*)tableView:(UITableView*)tableView 
   cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
   static NSSSTring* foo = @"foo";
   // [code to return a cell for the table]
}

据我了解,堆中 3 个字符的空间已分配用于存储字符串“foo”。当程序终止时,这三个字符永远不会被回收,因为作者从未释放它们。这里不是内存泄漏吗?为什么或为什么不?

【问题讨论】:

  • 看看我不久前提出的这个问题。 stackoverflow.com/questions/4436016/…
  • 请注意:当程序终止时,相应进程分配的所有内存都被操作系统回收。无论对象是静态字符串还是堆分配对象,都不会在终止时发生内存泄漏。

标签: objective-c cocoa-touch memory-management


【解决方案1】:

实际上,像@"foo" 这样的常量字符串会被编译器特殊处理。特别是,它们没有在堆上分配,并且它们不参与引用计数,即它们从未真正被释放;它们的记忆是程序图像的一部分,就像"foo" 的内容一样。但是,这应该被视为这种特定类型的NSString 子类的实现细节。遵循参考保留/释放的常规规则。

【讨论】:

    猜你喜欢
    • 2011-10-13
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 2012-10-29
    • 2014-06-06
    • 1970-01-01
    相关资源
    最近更新 更多