Mac OSX objective-c NSString 内存泄漏与 ARC
Mac OSX objective-c NSString memory leaking with ARC
今天我用NSStrings
测试了一个。可悲的是,当我 运行 这段代码(xcode 仪器向我显示)时,我有严重的内存泄漏:
- (IBAction)start:(id)sender {
while (true) // Yes I know that this is an infinity loop
{
NSString *test = [[NSString alloc] init];
test = [NSString stringWithFormat:@"llalalallalalallalalalalallalalllallalalallalal"];
test = nil;
// Why does this leak memory ? I think ARC is releasing it automatically ?
}
}
这是仪器的屏幕截图:
我能帮我理解一下吗为什么这段代码会泄露(ARC 开启)?
内存只是在自动释放池中,当池被耗尽时内存被回收。通常这是 运行 循环循环的时候,但在像这样的紧密循环中,运行 循环永远没有机会,因此需要明确地耗尽池。
在这种情况下,就在脚趾循环内添加一个自动释放池:
@autoreleasepool {
code
}
在这种情况下:
while (true) // Yes I know that this is an infinity loop
{
@autoreleasepool {
NSString *test = [[NSString alloc]init];
test = [NSString stringWithFormat:@"llalalallalalallalalalalallalalllallalalallalal"];
test = nil;
}
}
顺便说一句,没有格式代码的 stringWithFormat
只是创建与按字面定义的字符串相同的字符串:
test = @"llalalallalalallalalalalallalalllallalalallalal";
今天我用NSStrings
测试了一个。可悲的是,当我 运行 这段代码(xcode 仪器向我显示)时,我有严重的内存泄漏:
- (IBAction)start:(id)sender {
while (true) // Yes I know that this is an infinity loop
{
NSString *test = [[NSString alloc] init];
test = [NSString stringWithFormat:@"llalalallalalallalalalalallalalllallalalallalal"];
test = nil;
// Why does this leak memory ? I think ARC is releasing it automatically ?
}
}
这是仪器的屏幕截图:
我能帮我理解一下吗为什么这段代码会泄露(ARC 开启)?
内存只是在自动释放池中,当池被耗尽时内存被回收。通常这是 运行 循环循环的时候,但在像这样的紧密循环中,运行 循环永远没有机会,因此需要明确地耗尽池。
在这种情况下,就在脚趾循环内添加一个自动释放池:
@autoreleasepool {
code
}
在这种情况下:
while (true) // Yes I know that this is an infinity loop
{
@autoreleasepool {
NSString *test = [[NSString alloc]init];
test = [NSString stringWithFormat:@"llalalallalalallalalalalallalalllallalalallalal"];
test = nil;
}
}
顺便说一句,没有格式代码的 stringWithFormat
只是创建与按字面定义的字符串相同的字符串:
test = @"llalalallalalallalalalalallalalllallalalallalal";