注释过的反汇编代码:http://pan.baidu.com/share/link?shareid=3491166579&uk=537224442
伪代码(不精确,仅供参考):
NSString* _UICacheNameForImageAtPath(NSString *imageName,NSBundle *bundle);
NSString* ProductSuffix();
UIImage* GetImageAtPath(NSString *imageFilePath,CGFloat scale);
NSMutableDictionary *gCacheNameToImageMap =nil;
NSMutableDictionary *gImageToCacheNameMap =nil;
BOOL __prefer2xImages = NO;
UIImage *_UIImageAtPath(NSString *imageFileName,NSBundle *mainBundle, BOOL shouldForce1xScale)
{
// imageFileName = @"Default.png"
if ([imageFileName length] == 0)
return nil;
// bundleIdentifier_imageFileName
NSString *cacheNameOfImage =_UICacheNameForImageAtPath(imageFileName, mainBundle);
UIImage *resultImage = nil;
if (gCacheNameToImageMap !=nil)
{
resultImage = [gCacheNameToImageMapobjectForKey:cacheNameOfImage];
if (resultImage != nil)
{
if (![resultImage _isCached])
{
[resultImage retain];
}
[resultImage _setCached:YES];
return resultImage;
}
}
else
{
gCacheNameToImageMap = [NSMutableDictionarydictionary];
gImageToCacheNameMap = [NSMutableDictionarydictionary];
}
BOOL force1xScale = NO;
if (__prefer2xImages)
{
force1xScale = shouldForce1xScale;
}
NSString *imageExt = [imageFileNamepathExtension];
if ([imageExt length] == 0)
{
imageExt = @"png";
}
NSString *bundlePath = nil;
if (mainBundle != nil)
{
bundlePath = [mainBundle bundlePath];
}
NSString *productSuffix = ProductSuffix();// ~iphone, ~ipad
NSString *imageNameWithoutSuffix = [imageFileNamestringByReplacingOccurrencesOfString:productSuffixwithString:@""];
// Default
NSString *imageNameWithoutSuffixAndExt = [imageNameWithoutSuffixstringByDeletingPathExtension];
// Default~iphone
NSString *imageNameWithSuffix = [imageNameWithoutSuffixAndExtstringByAppendingString:productSuffix];
// Default@1x
NSString *imageName1x = [imageNameWithoutSuffixAndExtstringByAppendingString:@"@1x"];
// Default@1x~iphone
NSString *imageName1xWithSuffix = [imageName1xstringByAppendingString:productSuffix];
// Default_1only_
NSString *imageName_1only_ = [imageNameWithoutSuffixAndExtstringByAppendingString:@"_1only_"];
// Default_1only_~ipnone
NSString *imageName_1only_WithSuffix = [imageName_1only_stringByAppendingString:productSuffix];
// Default@2x
NSString *imageName2x = [imageNameWithoutSuffixAndExtstringByAppendingString:@"@2x"];
// Default@2x~iphone
NSString *imageName2xWithSuffix = [imageName2xstringByAppendingString:productSuffix];
// Default_2only_@2x
NSString *imageName_2only_2x = [imageNameWithoutSuffixAndExtstringByAppendingString:@"_2only_@2x"];
// Default_2only_@2x~iphone
NSString *imageName_2only_2xWithSuffix = [imageName_2only_2xstringByAppendingString:productSuffix];
NSString *targetFileName =nil;
NSString *targetFilePath =nil;
if (!force1xScale)
{
// Default@2x~iphone.png
targetFileName = [imageName2xWithSuffix stringByAppendingPathExtension:imageExt];
targetFilePath = [bundlePath stringByAppendingPathComponent:targetFileName];
resultImage = GetImageAtPath(targetFilePath,2.0f);
// Default_2only_@2x~iphone.png
if (resultImage == nil)
{
targetFileName = [imageName_2only_2xWithSuffix stringByAppendingPathExtension:imageExt];
targetFilePath = [bundlePath stringByAppendingPathComponent:targetFileName];
resultImage = GetImageAtPath(targetFilePath,2.0f);
}
if (resultImage == nil)
{
targetFileName = [imageName2x stringByAppendingPathExtension:imageExt];
targetFilePath = [bundlePath stringByAppendingPathComponent:targetFileName];
resultImage = GetImageAtPath(targetFilePath,2.0f);
}
if (resultImage == nil)
{
targetFileName = [imageName_2only_2x stringByAppendingPathExtension:imageExt];
targetFilePath = [bundlePath stringByAppendingPathComponent:targetFileName];
resultImage = GetImageAtPath(targetFilePath,2.0f);
}
}
if (resultImage == nil)
{
// Default~iphone.png
targetFileName = [imageNameWithSuffix stringByAppendingPathExtension:imageExt];
targetFilePath = [bundlePath stringByAppendingPathComponent:targetFileName];
resultImage = GetImageAtPath(targetFilePath,1.0f);
// Default.png
if (resultImage == nil)
{
targetFileName = [imageNameWithoutSuffixAndExt stringByAppendingPathExtension:imageExt];
targetFilePath = [bundlePath stringByAppendingPathComponent:targetFileName];
resultImage = GetImageAtPath(targetFilePath,1.0f);
}
// Default@1x~iphone.png
if (resultImage == nil)
{
targetFileName = [imageName1xWithSuffix stringByAppendingPathExtension:imageExt];
targetFilePath = [bundlePath stringByAppendingPathComponent:targetFileName];
resultImage = GetImageAtPath(targetFilePath,1.0f);
}
// Default_1only_~ipnone.png
if (resultImage == nil)
{
targetFileName = [imageName_1only_WithSuffix stringByAppendingPathExtension:imageExt];
targetFilePath = [bundlePath stringByAppendingPathComponent:targetFileName];
resultImage = GetImageAtPath(targetFilePath,1.0f);
}
if (resultImage == nil)
{
targetFileName = [imageName1x stringByAppendingPathExtension:imageExt];
targetFilePath = [bundlePath stringByAppendingPathComponent:targetFileName];
resultImage = GetImageAtPath(targetFilePath,1.0f);
}
// Default_1only.png
if (resultImage == nil)
{
targetFileName = [imageName_1only_ stringByAppendingPathExtension:imageExt];
targetFilePath = [bundlePath stringByAppendingPathComponent:targetFileName];
resultImage = GetImageAtPath(targetFilePath,1.0f);
}
// Default~iphone
if (resultImage == nil)
{
targetFilePath = [bundlePath stringByAppendingPathComponent:imageNameWithSuffix];
resultImage = GetImageAtPath(targetFilePath,1.0f);
}
// Default
if (resultImage == nil)
{
targetFilePath = [bundlePath stringByAppendingPathComponent:imageNameWithoutSuffixAndExt];
resultImage = GetImageAtPath(targetFilePath,1.0f);
}
}
if (resultImage == nil)
{
if (!force1xScale)
{
targetFilePath = [mainBundle pathForResource:imageName2x ofType:imageExt];
resultImage = GetImageAtPath(targetFilePath,2.0f);
if (resultImage ==nil)
{
targetFilePath = [mainBundle pathForResource:imageName_2only_2x ofType:imageExt];
resultImage = GetImageAtPath(targetFilePath,2.0f);
}
}
// Default.png
if (resultImage == nil)
{
targetFilePath = [mainBundle pathForResource:imageNameWithoutSuffixAndExt ofType:imageExt];
resultImage = GetImageAtPath(targetFilePath,1.0f);
}
if (resultImage == nil)
{
targetFilePath = [mainBundle pathForResource:imageName1x ofType:imageExt];
resultImage = GetImageAtPath(targetFilePath,1.0f);
}
// Default_1only_.png
if (resultImage == nil)
{
targetFilePath = [mainBundle pathForResource:imageName_1only_ ofType:imageExt];
resultImage = GetImageAtPath(targetFilePath,1.0f);
}
}
if (resultImage != nil)
{
[gCacheNameToImageMap setValue:resultImage forKey:cacheNameOfImage];
[gImageToCacheNameMap setValue:cacheNameOfImage forKey:resultImage];
[resultImage _setNamed:YES];
[resultImage _setCached:YES];
}
return resultImage;
}