@autoreleasepool似乎没有流失池

时间:2015-03-20 01:13:28

标签: ios cocoa automatic-ref-counting

我在更大的应用程序中遇到内存问题。我把它简化为下面的代码。如果我让应用程序运行完成,内存耗尽,因此我没有真正的内存泄漏。

然而,当它正在运行时,每次调用customLog:累积内存并且内存不会耗尽。所以我添加了一个@autoreleasepool块来包含对log的调用:它似乎仍然没有消耗掉。我可能没有正确使用@autoreleasepool吗?

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {

    // Insert code here to initialize your application

    for (int i=0; i<100000; i++) {
        [Logger customLog:[NSString stringWithFormat:@"%i", i]];
    }

    for (int i=0; i<100000000; i++) {
        NSLog(@"X%i", i);
    }
}

记录器类:

- (void)customLog:(NSString *)logString
{
    @autoreleasepool {
        [self log:[[NSString alloc] initWithFormat:@"%@ %@:%d\t\t%s\t\%@", [[NSDate  date] descriptionWithCalendarFormat:@"%Y-%m-%d %H:%M:%S.%F" timeZone:nil locale:[[NSUserDefaults standardUserDefaults] dictionaryRepresentation]], [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, __FUNCTION__, logString]];
    }
}

1 个答案:

答案 0 :(得分:4)

自动释放池位于错误的位置。您只清理在@autoreleasepool内创建的所有自动释放的对象。但是您在自动释放池之外创建了数千个临时NSString对象,因此在完成对applicationDidFinishLaunching:的调用之后,这些对象才会被清除。

尝试:

for (int i=0; i<100000; i++) {
    @autoreleasepool {
        [Logger customLog:[NSString stringWithFormat:@"%i", i]];
    }
}

并删除@autoreleasepool方法中的customLog: