App crashed on reading image in bundle when there is only a color with the same name.

Related APIs:

  1. +[UIImage imageNamed:]
  2. +[UIImage imageNamed:inBundle:compatibleWithTraitCollection:]

When there is only a color set with the name (no image set provided), reading the image with the above-mentioned APIs throws an exception:

2023-12-19 19:30:34.008701+0800 ***[57410:578064] *** Assertion failure in -[_UIImageCGImageContent initWithCGImageSource:CGImage:scale:], _UIImageContent.m:666
2023-12-19 19:30:34.031207+0800 ***[57410:578064] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Need an imageRef'

Even when wrapped in a try/catch block, it still crashes due to a lock issue after calling the related API twice. Here is an example code snippet:

    UIImage *image;
    for (NSInteger i=0; i<10; i++) {
        @try {
            image = [UIImage imageNamed:@"sample"];
            //image = [UIImage imageNamed:@"sample" inBundle:[NSBundle mainBundle] compatibleWithTraitCollection:nil];
        } @catch (NSException *exception) {
        }
    }

The crash backtrace is as follows:

#0	0x0000000102b12214 in _os_unfair_lock_recursive_abort ()
#1	0x0000000102b0da50 in _os_unfair_lock_lock_slow ()
#2	0x000000010ab07624 in -[UIImageAsset imageWithConfiguration:] ()
#3	0x000000010b2f4634 in -[_UIAssetManager imageNamed:configuration:] ()
#4	0x000000010aaf2394 in +[UIImage imageNamed:inBundle:withConfiguration:] ()
#5	0x000000010aaf2200 in +[UIImage imageNamed:inBundle:compatibleWithTraitCollection:] ()
#6	0x0000000105442154 in +[UIImageAccessibility imageNamed:inBundle:compatibleWithTraitCollection:] ()

It seems that the color set is being treated as an imageRef in this image reading process.

It's a bug of UIKit?

Replies

Yes, this is likely a UIKit issue—please file a feedback report with a sample project if you would like it fixed. That being said, this is fairly easy to work around—simply avoid loading images that aren't in the asset catalog.