【问题标题】:UIGraphicsGetImageFromCurrentImageContext() retain cause crashUIGraphicsGetImageFromCurrentImageContext() 保留导致崩溃
【发布时间】:2012-04-18 06:34:11
【问题描述】:

这很奇怪,但我想我只是缺少一些简单的东西。

我有一个名为 Theme 的 Objective C 类。 主题从文件中加载我的游戏的所有艺术作品并将它们存储在 NSMutableArray 中。

当应用启动时,它会创建一个新的 Theme 对象。 加载过程的一部分是这样的:

UIImage *image = [self mergeImage: bg toImage: overlay];
[imageArray addObject: image];

我使用以下代码获取背景图像并将叠加层放置在其顶部,创建一个新的 UIImage:

- (UIImage *)mergeImage:(UIImage *)image1 toImage:(UIImage *)image2 { 
UIGraphicsBeginImageContext(image1.size);  

[image1 drawInRect:CGRectMake(0, 0, image1.size.width, image1.size.height)];  

[image2 drawInRect:CGRectMake(0, 0, image2.size.width, image2.size.height)];  

UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();  
//[resultingImage retain];

UIGraphicsEndImageContext();  

return resultingImage;
} 

所有这些都发生在 Theme 的 init 函数中。 这是问题,当我从

调用 [[Theme alloc] init]
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

应用程序在一秒钟后崩溃,让我没有堆栈或任何东西(我认为它会破坏一些内存并在稍后再次使用它或其他什么时崩溃)。

这是奇怪的部分。如果我不将新合并的图像添加到 imageArray,它永远不会崩溃。我没有图像了,但没有崩溃。另外,如果我不将图像添加到数组中,而是将其保留在 mergeImage 函数中,它确实会崩溃,这让我认为保留这个新制作的图像会导致问题。 更奇怪的是,如果我直到稍后在应用程序中调用 mergeImage,在 [Theme init] 和 didFinishLaunchingWithOptions 之外,没关系。

知道为什么吗?在应用首次启动时保留此图像有什么问题?

【问题讨论】:

  • 您的 imageArray 是否在您在其中添加新图像时初始化?
  • 你检查结果图像是否不为零?
  • 我没有使用 ARC。我的 ImageArray 在此之前被分配和初始化。创建了一个 UIImage,因此该值不为零。完成后,imageArray 有一个不是 nil 的对象,它确实对该对象调用了 retain,我什至可以在调试器中检查 retainCount。

标签: objective-c ios uiimage release retain


【解决方案1】:

试试下面的代码:

UIGraphicsBeginImageContext(drawImage.bounds.size); 
[drawImage.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext();
return viewImage

谢谢..!

【讨论】:

  • drawImage是什么类型的对象?如果 drawObject 是 UIImage*,我会收到错误消息
  • 好吧,它并没有完全奏效,但它让我走上了正确的道路,所以我将其标记为已回答。我仍然不完全确定问题出在哪里,但我发现如果我将图像合并到与创建它的函数不同的函数中,它就会起作用。所以我只做了 2 个函数,一个用来创建,一个用来合并,并从 init 中调用它们。
猜你喜欢
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 2014-05-18
  • 2018-01-23
  • 2020-12-02
  • 2013-11-11
  • 2011-01-24
  • 2015-02-23
相关资源
最近更新 更多