gpt4 book ai didi

ios - @autoreleasepool 似乎没有耗尽池

转载 作者:行者123 更新时间:2023-11-28 18:58:25 24 4
gpt4 key购买 nike

我在大型应用程序中遇到内存问题。我已将其简化为以下代码。如果我让应用程序运行到完成,内存就会耗尽,因此我没有真正的内存泄漏。

但是,在它运行时,每次调用 customLog: 都会累积内存并且内存不会耗尽。所以我添加了一个 @autoreleasepool block 来包装对 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]];
}
}

最佳答案

自动释放池在错误的地方。您只需清除在 @autoreleasepool 中创建的所有自动释放对象。但是您在自动释放池之外创建了数千个临时 NSString 对象,因此在调用 applicationDidFinishLaunching: 完成之前不会清理这些对象。

尝试:

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

并删除 customLog: 方法中的 @autoreleasepool

关于ios - @autoreleasepool 似乎没有耗尽池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29157794/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com