逆向iOS SDK -- _UIImageAtPath 的实现(SDK 5.1)
来源:互联网 发布:eclipse for linux 32 编辑:程序博客网 时间:2024/06/08 17:13
注释过的反汇编代码: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);
}
// 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)
{
[gCacheNameToImageMap setValue:resultImage forKey:cacheNameOfImage];
[gImageToCacheNameMap setValue:cacheNameOfImage forKey:resultImage];
[resultImage _setNamed:YES];
[resultImage _setCached:YES];
}
return resultImage;
}
- 逆向iOS SDK -- _UIImageAtPath 的实现(SDK 5.1)
- 逆向iOS SDK -- _UIImageAtPath 的实现(SDK 6.1)
- 逆向iOS SDK -- +[UIImage imageNamed:] 的实现
- 逆向iOS SDK -- “添加本地通知”的流程分析
- iOS SDK的设计与实现
- IOS SDK的架构
- SDK(ios)
- IOS SDK
- iOS SDK
- SDK(ios)
- iOS MTA的SDK插入,以及基本功能实现
- iOS毛玻璃效果的实现(针对iOS8以上SDK)
- GStreamer iOS SDK的安装
- iOS SDK更新换代的功能
- ios sdk的排查过程
- iOS开发自己的sdk
- IOS几种常见的实现扫描、生成二维码的方式(一、使用ZBar SDK)
- 利用Olami SDK 实现语音控制计算器(iOS)
- Linux内核的Makefile和kconfig解读
- 彩色模型
- 三层架构中的参数传递
- 进击的黑客打破苹果资安之墙,巨人来自土耳其?
- Oracle 10053事件内部原理与测试【2】
- 逆向iOS SDK -- _UIImageAtPath 的实现(SDK 5.1)
- 彻底卸载SQL SERVER 2008
- uva 10115 Automatic Editing(strstr函数查找子串)
- 25个必须记住的SSH命令,你用过了吗?
- mutt+fetchmail+procmail+exim4 邮件服务器
- AOP
- [2013.7.24] 工作日志
- STL LIST中自定义排序函数例子
- SQL Server 2008 安装时,提示不是有效的安装路径