【问题标题】:Objective C @autoreleasepool infinite loop taking screenshotsObjective C @autoreleasepool 无限循环截图
【发布时间】:2013-03-25 23:27:25
【问题描述】:

我有一个内存问题,小应用程序每 X 毫秒获取无限量的屏幕截图并将它们显示在图像视图中。即使使用自动释放,它也会很快淹没内存。代码如下:

- (void)draw {
    do {
        @autoreleasepool {
            CGImageRef image1 = CGDisplayCreateImage(kCGDirectMainDisplay);

            NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCGImage:image1];
            NSImage *image = [[NSImage alloc] init];
            [image addRepresentation:bitmapRep];
            _imageView.image = image;
            [NSThread sleepForTimeInterval:1];
        }
    }while(true);
}

有什么想法吗?

【问题讨论】:

  • 你不能在没有 ARC 的情况下使用 @autoreleasepool。
  • @RamyAlZuhouri:是的,你可以。它与 ARC 同时引入,但不需要 ARC。
  • 由于您永远不会将控制权返回给运行循环,我假设这是在后台线程上运行的。您正在访问一个 UI 控件 (_imageView),它只允许在主线程上使用。您可能应该将其更改为 dispatch_async(dispatch_get_main_thread(), ^{ _imageView.image = image; });
  • 我忘了在原帖中提到它,但是是的,我确实使用了 ARC,是的,这个循环在它自己的线程中运行。但是谢谢大家,用 CGImageRelease(image1); 明确发布图像;做到了

标签: objective-c xcode memory-leaks screenshot autorelease


【解决方案1】:

您需要使用CGImageRelease发布图像

- (void)draw {
    do {
        @autoreleasepool {
            CGImageRef image1 = CGDisplayCreateImage(kCGDirectMainDisplay);

            NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCGImage:image1];
            NSImage *image = [[NSImage alloc] init];
            [image addRepresentation:bitmapRep];
            _imageView.image = image;
            CGImageRelease(image1);   // release the image
            [NSThread sleepForTimeInterval:1];
        }
    }
    while(true);
}

【讨论】:

  • 谢谢你这样做了。我认为 ARC 正在负责发布该图像。
  • ARC 负责释放 ObjC 对象,例如 NSImageNSBitmapImageRep。但是CGImageRef 是核心基础对象(只是指向 C 结构的指针),ARC 无法为您处理
【解决方案2】:

我假设您在这里没有使用 ARC。

您似乎误解了自动释放池的作用。它不会通过自己的特权神奇地释放对象(这就是 ARC 的用途!)。您将对象添加到池中 - 通过使用autorelease(在托管保留/释放模式下)或通过使用为您自动释放的便利构造函数 - 当它被销毁时,池将在每次对象被释放时释放每个对象添加到池中。您在此处用于创建对象的方法 alloc 返回您拥有的对象,因此您必须明确释放该对象的所有权。

只需添加到循环的底部:

[image release];
[bitmapRep release];
CGImageRelease(image1);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    相关资源
    最近更新 更多