ios - NSAutoreleasepool 是否存在泄漏?

标签 ios memory-leaks pool autorelease nsautoreleasepool

结果会怎样?是否有任何泄漏或崩溃?

-(NSString)returnPersonName {
NSAutorelease *pool = [[NSAutorelease alloc]init];
NSString *name = [[[NSString alloc]initWithString:@"Name"]autorelease];
[pool drain];
return name
}

让我有点困惑。

最佳答案

  1. 此代码违反了内存管理规则。您执行alloc,因此获得+1引用计数的所有权,然后对其执行autorelease,从而放弃对引用计数的所有权。因此,您不应再使用name,并且不能保证它指向有效的对象。您返回它,一个指向可能无效对象的指针。
  2. 在这种特殊情况下,由于 Cocoa 的实现细节,不会发生任何“不好”的事情。该函数的主体相当于 return @"Name";@"Name" 是一个字符串文字,字符串文字存储在静态存储中,该静态存储在程序的整个生命周期中都存在。这意味着这些字符串对象不受内存管理——retainrelease 对它们没有影响。您对其执行 [[NSString alloc] init...] ,但 NSString 的初始化器经过优化,可以简单地保留并返回其参数(如果参数已经是不可变的)字符串。所以你不会返回一个新的 NSString 对象;您只是返回相同的字符串文字,该字符串文字是静态分配的并且不受内存管理的约束。再说一次,所有这些都是 Cocoa 的实现细节,你不能依赖。

关于ios - NSAutoreleasepool 是否存在泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31676009/

相关文章:

objective-c - self 释放后

ios - SKSpriteNode 弹跳我没有在 Swift 中创建的东西

c# - Base64转换后如何释放内存

ubuntu - 如何在 Ubuntu 20.04 LTS 中将/pool 添加到我的 sources.list 文件中?

Python - 多进程池中的 make_archive zip 无法正常工作

iphone - 在iOS应用程序中添加自定义表情

iphone - Howe 捕获 UIView 顶部 UIView

c++ - 从文件读取时内存泄漏

java - 如何在 java 中找到匿名类的 GC 根?

java - 同一父类的许多对象的 LibGdx 对象池