ios - 为什么自动释放对象还活着?

标签 ios memory-management autorelease

我已经创建了自动释放池。 localString 已添加到此池中。我释放了游泳池。 localString 和 string 必须被释放。但实际上他们还活着。你可以看到我的日志:

Why is the string object still alive? I don't know. 

和代码:
-(NSString*) happyString
{
 NSString *localString = [[[NSString alloc] initWithString:@"I don't know."] autorelease];
 return localString;
}

-(IBAction) onButton:(id)sender
{
 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 NSString *string = [self happyString];
 [pool release]; 

 NSLog(@"Why is the string object still alive? %@", string);  
}

最佳答案

字符串( NSString 实例和带有 @"" 的静态分配字符串)在 Cocoa 中是不可变的,因此当您尝试创建新的 NSString 时从静态分配的 NSString class 可以做一个优化:一个新的 NSString未创建实例(调用 -alloc 时创建的对象会立即释放),并且返回对静态分配的字符串的引用。也就是说,该行:

NSString *localString = [[[NSString alloc] initWithString:@"I don't know."] autorelease];

实际上相当于:
NSString *localString = @"I don't know.";

(如果你检查这两个对象的内存地址,你会发现它们是一样的。)
由于这种类型的字符串无法释放,因此它不会在您期望的时候消失。

如果您要以无法优化的方式创建字符串,例如:
NSString *localString = [[[NSString alloc] initWithFormat:@"%@", @"I don't know."] autorelease];

然后您的代码将按照您的预期运行,您的应用程序将(希望)在您的 NSLog 处崩溃。线。

关于ios - 为什么自动释放对象还活着?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9078198/

相关文章:

c++ - 如何释放 unordered_map 内存?

C++,为什么在修改新分配的对象后会出现访问冲突?

objective-c - 重新分配给包含自动释放对象的指针是否不正确?

Objective-C 访问 block 内的属性

C内存池存储

iphone - 为什么窗口自动释放在应用程序 :didFinishLaunchingWithOptions: and released in dealloc?

c++ - 在 Cocos2d-x 中,CC_SAFE_DELETE 和 CC_SAFE_RELEASE_NULL 有什么区别?

iphone - 如何通过数组计数对嵌套NSArray的NSArray进行排序?

ios - 在 iOS 上用多个正则表达式替换文本

iphone - iOS 应用的兼容设备列表