gpt4 book ai didi

ios - 内存泄漏 - NSData 和 NSMutableString

转载 作者:行者123 更新时间:2023-11-29 05:02:58 24 4
gpt4 key购买 nike

解析一个 20MB 的文件,该文件太大而无法在 2G iPod touch 上解析。我注释掉了除 NSData/NSMutableString 部分之外的所有代码,但仍然存在泄漏。我不明白....

支持从文件读取 block 的方法:

+ (NSData *) dataWithContentsOfFile:(NSString *)path atOffset:(off_t)offset withSize:(size_t)bytes  {
FILE *file = fopen([path UTF8String], "rb");
if(file == NULL)
return nil;

void *data = malloc(bytes); // check for NULL!
fseeko(file, offset, SEEK_SET);
fread(data, 1, bytes, file); // check return value, in case read was short!
fclose(file);

// NSData takes ownership and will call free(data) when it's released
return [NSData dataWithBytesNoCopy:data length:bytes];
}

以及泄露的准系统代码:

while( cnt<total) {
NSAutoreleasePool* pool= [[NSAutoreleasePool alloc] init];

NSData* data= [NSData dataWithContentsOfFile:fullPath atOffset:cnt withSize:MIN(100000,total-cnt)];
NSString* xmlFragment = [[NSString alloc] initWithBytes: [data bytes] length:[data length] encoding: NSUTF8StringEncoding];
cnt+= [xmlFragment length];

[pool drain];
}

最佳答案

每次在循环中时,您都会执行alloc-init,但没有释放,因此代码中存在泄漏。

NSString* xmlFragment  = [[NSString alloc] initWithBytes: [data bytes] length:[data length] encoding: NSUTF8StringEncoding];

上述语句没有平衡release。如果你这样做,

NSString* xmlFragment  = [[[NSString alloc] initWithBytes: [data bytes] length:[data length] encoding: NSUTF8StringEncoding] autorelease];

它将在[池排水];处释放。然而循环似乎毫无意义。您可能打算做更多的事情,例如将 xmlFragment 添加到可变字符串中?

关于ios - 内存泄漏 - NSData 和 NSMutableString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6432840/

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