[原]逆向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; } |
?
?
轉載于:https://www.cnblogs.com/Proteas/p/3213487.html
總結
以上是生活随笔為你收集整理的[原]逆向iOS SDK -- _UIImageAtPath 的实现(SDK 5.1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重写与重载常见问题
- 下一篇: Tomcat JVM 初始化加大内存