objective-c - objc 泄漏行为我无法解释

标签 objective-c cocoa macos

以下代码循环不会泄漏内存(通过观察它在“top”下无限循环来验证);

NSBitmapImageRep *this_bmap = 0;

while (1) {

  CGImageRef windowImage = 
     CGWindowListCreateImage(CGRectNull,
                             kCGWindowListOptionIncludingWindow,
                             windowID, kCGWindowImageDefault);

  this_bmap = [[NSBitmapImageRep alloc] initWithCGImage:windowImage];

  [this_bmap release];
  CGImageRelease(windowImage);
}

我没想到会这样。但是,当我复制指向位图数据的指针时,如下所示:

NSBitmapImageRep *this_bmap = 0;

while (1) {

  CGImageRef windowImage = 
     CGWindowListCreateImage(CGRectNull,
                             kCGWindowListOptionIncludingWindow,
                             windowID, kCGWindowImageDefault);

  this_bmap = [[NSBitmapImageRep alloc] initWithCGImage:windowImage];

  void *pixels1 = [this_bmap bitmapData];

  [this_bmap release];
  CGImageRelease(windowImage);
}

这现在像疯了一样泄漏。我可以看到这种情况在“top”下迅速发生,程序最终会停止。

我是 Objective-C 的新手,但我不是编程新手,我无法理解这种行为。方法 bitmapData 的文档声称它只是返回一个指针(而不是分配一些东西),所以我很困惑。我前段时间发现了一个类似的问题,但唯一的答案是“查看池”,我看不出这对这里有什么帮助。

知道这里发生了什么吗?

最佳答案

访问像素数据会导致对象被保留和自动释放,这样位图数据就不会突然意外消失。要查看您的预期结果(即循环不在每次迭代中消耗内存),重写为:

NSBitmapImageRep *this_bmap = 0;

while (1) {
  NSAutoreleasePool* loopPool = [NSAutoreleasePool new];
  CGImageRef windowImage = 
     CGWindowListCreateImage(CGRectNull,
                             kCGWindowListOptionIncludingWindow,
                             windowID, kCGWindowImageDefault);

  this_bmap = [[NSBitmapImageRep alloc] initWithCGImage:windowImage];

  void *pixels1 = [this_bmap bitmapData];

  [this_bmap release];
  CGImageRelease(windowImage);
  [loopPool drain];
}

关于objective-c - objc 泄漏行为我无法解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4170799/

相关文章:

ios - NSLinguisticTagger:根据标记类型过滤掉指定的标记

c++ - 尝试将 const char * 转换为 NSString 时为空字符串

objective-c - 将背景内容淡入新背景

cocoa - 是否行程矩形 : of NSBezierPath always draw a transparent rect? (Cocoa OSX)

cocoa - NSTokenField 和删除标记

macos - 使用 IntelliJ 作为 git mergetool 总是一启动就退出

iOS - 调用方法 : [self. navigationController pushViewController : animated:], 屏幕全黑

iphone - 如何使用 iPhone 摄像头测量房间内的可见蓝光强度?

cocoa - 核心数据和@unionOfSets

macos - 如何创建一个也有(可移动)停靠栏图标的辅助应用程序 (LSUIElement)