我在更大的应用程序中遇到内存问题。我把它简化为下面的代码。如果我让应用程序运行完成,内存耗尽,因此我没有真正的内存泄漏。
然而,当它正在运行时,每次调用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]];
}
}
答案 0 :(得分:4)
自动释放池位于错误的位置。您只清理在@autoreleasepool
内创建的所有自动释放的对象。但是您在自动释放池之外创建了数千个临时NSString
对象,因此在完成对applicationDidFinishLaunching:
的调用之后,这些对象才会被清除。
尝试:
for (int i=0; i<100000; i++) {
@autoreleasepool {
[Logger customLog:[NSString stringWithFormat:@"%i", i]];
}
}
并删除@autoreleasepool
方法中的customLog:
。