[原]逆向iOS SDK -- _UIImageAtPath 的实现(SDK 5.1)
注释过的反汇编代码: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) returnnil;
// 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 = [imageFileName pathExtension]; if ([imageExt length] == 0) { imageExt = @"png"; }
NSString *bundlePath = nil; if (mainBundle != nil) { bundlePath = [mainBundle bundlePath]; }
NSString *productSuffix = ProductSuffix();// ~iphone, ~ipad NSString *imageNameWithoutSuffix = [imageFileName stringByReplacingOccurrencesOfString:productSuffix withString:@""];
// Default NSString *imageNameWithoutSuffixAndExt = [imageNameWithoutSuffix stringByDeletingPathExtension]; // Default~iphone NSString *imageNameWithSuffix = [imageNameWithoutSuffixAndExt stringByAppendingString:productSuffix]; // Default@1x NSString *imageName1x = [imageNameWithoutSuffixAndExt stringByAppendingString:@"@1x"]; // Default@1x~iphone NSString *imageName1xWithSuffix = [imageName1x stringByAppendingString:productSuffix]; // Default_1only_ NSString *imageName_1only_ = [imageNameWithoutSuffixAndExt stringByAppendingString:@"_1only_"]; // Default_1only_~ipnone NSString *imageName_1only_WithSuffix = [imageName_1only_ stringByAppendingString:productSuffix];
// Default@2x NSString *imageName2x = [imageNameWithoutSuffixAndExt stringByAppendingString:@"@2x"]; // Default@2x~iphone NSString *imageName2xWithSuffix = [imageName2x stringByAppendingString:productSuffix]; // Default_2only_@2x NSString *imageName_2only_2x = [imageNameWithoutSuffixAndExt stringByAppendingString:@"_2only_@2x"]; // Default_2only_@2x~iphone NSString *imageName_2only_2xWithSuffix = [imageName_2only_2x stringByAppendingString: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); }
// Default@2x.png if (resultImage == nil) { targetFileName = [imageName2x stringByAppendingPathExtension:imageExt]; targetFilePath = [bundlePath stringByAppendingPathComponent:targetFileName]; resultImage = GetImageAtPath(targetFilePath, 2.0f); }
// Default_2only_@2x.png 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); }
// Default@1x.png 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) { // Default@2x.png targetFilePath = [mainBundle pathForResource:imageName2x ofType:imageExt]; resultImage = GetImageAtPath(targetFilePath, 2.0f);
// Default_2only_@2x.png 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); }
// Default@1x.png 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) { [gCacheNameToImageMapsetValue:resultImage forKey:cacheNameOfImage]; [gImageToCacheNameMapsetValue:cacheNameOfImage forKey:resultImage]; [resultImage _setNamed:YES]; [resultImage _setCached:YES]; }
return resultImage; } |