use*_*714 1 macos memory-leaks objective-c
我该如何修复这个内存泄漏?我有 NSBezierPath 的集合吗?我该如何修复这个内存泄漏?有什么建议吗?我正在使用ARC。
int main(int argc, const char * argv[])
{
@autoreleasepool {
// insert code here...
for(int j=0;j<5000;j++){
NSLog(@"Hello, World!");
NSSize imageSize = NSMakeSize(512, 512);
NSImage *image = [[NSImage alloc] initWithSize:imageSize];
//draw a line:
for(int i=0;i<1000;i++){
[image lockFocus];
float r1 = (float)(arc4random() % 500);
float r2 = (float)(arc4random() % 500);
float r3 = (float)(arc4random() % 500);
float r4 = (float)(arc4random() % 500);
[NSBezierPath strokeLineFromPoint:NSMakePoint(r1, r2) toPoint:NSMakePoint(r3, r4)];
}
//...
NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithFocusedViewRect:NSMakeRect(0, 0, imageSize.width, imageSize.height)];
NSData *pngData = [imageRep representationUsingType:NSPNGFileType properties:nil];
[image unlockFocus];
NSString *jstring = [NSString stringWithFormat:@"%d", j];
jstring = [jstring stringByAppendingString:@".png"];
[pngData writeToFile:jstring atomically:YES];
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
修改后的答案,现在我知道你正在使用 ARC:
这可能不是您正在泄漏,而是您的自动释放池随着循环的每次迭代而变得越来越大,因为在循环完成之前自动释放池不会清空。
您需要做的是在循环内使用辅助自动释放池。这是代码的修订版本来说明这一点。
int main(int argc, const char * argv[])
{
@autoreleasepool {
// insert code here...
for(int j=0; j<5000; j++) {
NSLog(@"Hello, World!");
NSSize imageSize = NSMakeSize(512, 512);
@autoreleasepool {
NSImage *image = [[NSImage alloc] initWithSize:imageSize];
//draw a line:
NSData *pngData;
for(int i=0;i<1000;i++){
[image lockFocus];
float r1 = (float)(arc4random() % 500);
float r2 = (float)(arc4random() % 500);
float r3 = (float)(arc4random() % 500);
float r4 = (float)(arc4random() % 500);
[NSBezierPath strokeLineFromPoint:NSMakePoint(r1, r2) toPoint:NSMakePoint(r3, r4)];
//...
NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithFocusedViewRect:NSMakeRect(0, 0, imageSize.width, imageSize.height)];
pngData = [imageRep representationUsingType:NSPNGFileType properties:nil];
[image unlockFocus];
}
NSString *jstring = [NSString stringWithFormat:@"%d", j];
jstring = [jstring stringByAppendingString:@".png"];
[pngData writeToFile:jstring atomically:YES];
}
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
不过,您似乎确实还有另一个问题。您正在为文件构建完整路径吗?
| 归档时间: |
|
| 查看次数: |
970 次 |
| 最近记录: |