2011-02-24 88 views
3

我想知道在什么情况下这个代码在第二个断言断裂。换句话说,什么时候可以-[UIImage CGImage]返回nil?这里的文档不是很明显。- [UIImage CGImage]返回零

- (void)setImage:(UIImage *)anImage { 
    assert(anImage); 
    CGImageRef cgimage = anImage.CGImage; 
    assert(cgimage); 
} 

我敢肯定,UIImage是正确的,因为它是从应用程序包中提取的。到目前为止,我还没有能够重现案件,但我确实看到一些用户崩溃报告。

+0

你是如何得到UIImage的? – 2011-02-24 14:56:00

+0

@Stephen,使用' - [UIImage imageNamed:@“pic.png”]'。 – 2011-02-24 15:14:45

回答

2

另一种可能是你有多个线程同时访问同一个UIImage对象;这发生在我的代码中有相同的症状。

这也可能解释您的零星崩溃报告,因为访问模式将取决于运行时间的变化。

1

据我所知,如果第一个断言通过(显示anImage不是零),这意味着它无法加载图像。检查以确保图像被复制到您的包中。

+0

它在捆绑中,它在99.9%的情况下工作。它只在第二个断言中失败,在一些我很难找到的罕见情况下。 – 2011-03-31 07:48:51

1

其中anImage将非空,但cgimage将是零可能如下做作的一个案例:

UIImage* myImage = [[UIImage alloc] initWithCGImage:nil]; 

由于以前的答案都表示还有其他的方式,人们可以找到自己在这样的情况下。

+0

你说得对,但我使用' - [UIImage imageNamed:@“pic.png”]'来创建图像。所以对我来说这仍然是一个谜。我知道通过忽略零图像而不是在断言中崩溃来解决这个问题。 – 2011-04-04 16:05:12

+0

你确定当你的应用程序的资源都已经建好时,pic.png会存在吗?在这种情况下,图像本身可能会丢失,在这种情况下,例程将返回'nil'。另一种可能性是,图像以某种方式损坏... – fbrereto 2011-04-04 16:07:21

+0

完全确定它存在。它在99.9%的案件中起作用,我甚至无法重现失败的案例。刚刚遇到一些崩溃报告,在某些情况下失败。值得注意的是,即使对于那些崩溃的设备,问题也只是随机发生。 – 2011-04-04 16:10:59

5

还有一个可能性,我已经在这个文档中遇到:

如果UIImage对象是使用CIImage对象初始化,该属性的值为NULL。