gpt4 book ai didi

ios - GLKTextureLoader-textureWithCGImage :options:queue:completionHandler: malloc error

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:21:07 24 4
gpt4 key购买 nike

我正在使用 GLKTextureLoader 实例异步加载纹理:

NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] 
forKey:GLKTextureLoaderOriginBottomLeft];
GLKTextureLoader *asyncLoader = [[GLKTextureLoader alloc] initWithSharegroup:sharegroup];
[asyncLoader textureWithCGImage:image
options:options
queue:NULL
completionHandler:^(GLKTextureInfo *textureInfo, NSError *outError) {
if (outError) [ISDebugger logError:outError inMethod:_cmd];
GLuint textureName = [textureInfo name];
if (completionHandler) completionHandler(textureName);
}];

第一次运行此代码时,它运行良好。但是第二次,我在控制台中收到了 malloc: *** error for object 0xa0cb3c0: pointer being freed was not allocated 警告。回溯似乎表明错误发生在 GLKTextureLoader 自己的工作线程中:

* thread #16: tid = 0x3003, 0x91a32c91 libsystem_c.dylib`malloc_error_break, stop reason = breakpoint 1.1
frame #0: 0x91a32c91 libsystem_c.dylib`malloc_error_break
frame #1: 0x91a32e07 libsystem_c.dylib`free + 358
frame #2: 0x011f5003 CoreGraphics`image_provider_finalize + 29
frame #3: 0x01b144b3 CoreFoundation`CFRelease + 291
frame #4: 0x0118d96c CoreGraphics`CGImageBlockSetRelease + 76
frame #5: 0x0154646c GLKit`-[GLKTexture dealloc] + 65
frame #6: 0x02184e3d libobjc.A.dylib`_objc_rootRelease + 47
frame #7: 0x01549da0 GLKit`+[GLKTextureLoader commonTextureWithCGImage:options:error:lock:eaglContext:] + 277
frame #8: 0x0154b77e GLKit`__71-[GLKTextureLoader textureWithCGImage:options:queue:completionHandler:]_block_invoke_0 + 140
frame #9: 0x0232b330 libdispatch.dylib`_dispatch_call_block_and_release + 15
frame #10: 0x0232c439 libdispatch.dylib`_dispatch_worker_thread2 + 302
frame #11: 0x919dfb24 libsystem_c.dylib`_pthread_wqthread + 346

很明显,纹理加载器似乎过度释放了某些东西。我在这里做错了什么?


更新:

传递给方法的图像是这样获得的:

NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
NSString *imagePath = [bundlePath stringByAppendingPathComponent:imageFilename];
UIImage *uiImage = [UIImage imageWithContentsOfFile:imagePath];
CGImageRef image = [uiImage CGImage];

将图像生成更改为此阻止了错误的发生:

UIImage *uiImage = [UIImage imageNamed:imageFilename];
CGImageRef image = [uiImage CGImage];

所以现在我想问题是为什么?我知道 +imageNamed: 包含一些缓存行为,但为什么这会影响此代码?


更新 2:

这与使用 [UIImage imageWithData:imageData] 创建图像时相同(发生崩溃)。似乎唯一的 [UIImage imageNamed:imageName] 正在工作。有什么想法吗?

最佳答案

您正在使用异步方法处理此项。执行发布的可能不是 asyncLoader,而是其他东西。

如果您在本地将图像声明为 UIImage,调用此 asyncLoader 运行,然后立即退出您当前的 stackFrame(即进行此调用的当前方法),则您传递的 UIImage 可能在您执行某些操作之前已被释放在 asyncLoader 中使用它。 (如果 UIImage 被传入,但在调用堆栈框架中被释放,则会发生同样的事情...... p>

我会建议从图像中创建一个强大的@property(并在您的 viewController 的 viewDidUnload 中将其设置为 nil),然后这个问题就会消失。

关于ios - GLKTextureLoader-textureWithCGImage :options:queue:completionHandler: malloc error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11383220/

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