编辑2014年2月:请注意,这个问题可以追溯到iOS 2.0!从那时起,图像要求和处理已经发生了很大变化.Retina使图像更大,加载它们稍微复杂一些.内置支持iPad和视网膜图像,您当然应该在代码中使用ImageNamed.
我看到很多人都说imageNamed
不好,但同样数量的人说性能很好 - 特别是在渲染时UITableView
.例如,在iPhoneDeveloperTips.com上查看此SO问题或本文
UIImage
imageNamed
用于泄漏的方法因此最好避免,但在最近的版本中已得到修复.我想更好地理解缓存算法,以便做出合理的决定,我可以信任系统来缓存我的图像,以及我需要加倍努力并自己完成.我目前的基本理解是它是一个简单NSMutableDictionary
的UIImages
文件名引用.它变得越来越大,当内存耗尽时,它会变得更小.
例如,有没有人确切知道后面的图像缓存imageNamed
没有响应didReceiveMemoryWarning
?Apple似乎不太可能不这样做.
如果您对缓存算法有任何了解,请在此处发布.
我是iOS和Xcode的新手.
我尝试加载图像
[UIImage imageNamed:@"imageName.png/jpg and so on"];
Run Code Online (Sandbox Code Playgroud)
但它只返回零.图像应该在我的项目包中,考虑到我可以从InterfaceBuilder中的拖放菜单中选择它,并通过"添加文件到"项目名"..."菜单将其添加到Xcode中.
我使用.png或.jpg图像没有区别,结果保持不变:它们通过IB工作,但如果我尝试自己运行imageNamed方法则不行.
我在iOS版本4的参考文献中读到了+使用object 的方法imageNamed
,UIImage
不需要文件扩展名.
从UIImage
课堂参考:
特别注意事项.
在iOS 4及更高版本中,不需要文件名来指定文件扩展名.在iOS 4之前,您必须指定文件扩展名.
但似乎这只适用于PNG文件.
如果我的代码是:
[UIImage imageNamed:@"test"];
Run Code Online (Sandbox Code Playgroud)
test.png
test.jpg
.对我来说这是一个很大的问题,因为我需要保持一个动态的图像加载(我不知道在运行时,如果我想加载图像png
或jpg
).
你能帮帮我吗?
谢谢.
根据Apple文档,建议在iOS7应用程序中使用xcassets,并通过imageNamed引用这些图像.
但据我所知,imageNamed和内存总是存在问题.
所以我做了一个简短的测试应用程序 - 使用imageNamed从xcassets目录中引用图像并启动了分析器...结果如预期的那样.一旦分配的内存没有再次释放,即使我从superview中删除了ImageView并将其设置为nil.
我目前正在开发一个带有许多大图像的iPad应用程序,这种奇怪的imageView行为会导致内存警告.
但在我的测试中,我无法通过imageWithContentsOfFile访问xcassets图像.
那么在iOS7上使用大图像的最佳方法是什么?有没有办法以另一种(更高性能)的方式从xcassets目录访问图像?或者我不应该使用xcassets,以便我可以使用imageWithContentsOfFile?
谢谢您的回答!
我有疑问:我想避免[UIImage imageNamed:].所以我做了:
UIImage *prodImg = [[UIImage alloc] initWithContentsOfFile:@"myimage.png"];
controller.productImg.image = prodImg;
[prodImg release];
Run Code Online (Sandbox Code Playgroud)
但现在图像不再显示了.
有谁知道如何让它工作?
正如许多人抱怨的那样,在用于Retina显示器的Apple SDK中,似乎存在一个错误,而imageWithContentsOfFile实际上并不会自动加载2x图像.
我偶然发现了一个很好的帖子,如何制作一个能够检测UIScreen比例因子并正确加载低或高分辨率图像的功能(http://atastypixel.com/blog/uiimage-resolution-independence-and-the-iphone-4s -retina-display /),但该解决方案加载2x图像并仍然将图像的比例因子设置为1.0,这导致2倍图像缩放2倍(因此,比它看起来大4倍)
imageNamed似乎可以准确地加载低分辨率和高分辨率图像,但对我来说不是一个选择.
有没有人有一个解决方案来加载低/高分辨率图像不使用imageNamed或imageWithContentsOfFile的自动加载?(或者最终解决方法如何使imageWithContentsOfFile工作正确)
所以,我有一个xcassets,在很多应用程序之间共享.我正在Mac Mini中使用Xcode8进行开发,其中安装了MacOs Sierra.如果我在开发机器中编译并运行,则根本没有问题.但是,当我尝试在OSX Mavericks的设备中运行它时,我遇到了崩溃.这是报告中的痕迹
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 libsystem_kernel.dylib 0x00007fff887dc866 __pthread_kill + 10
1 libsystem_pthread.dylib 0x00007fff87a3935c pthread_kill + 92
2 libsystem_c.dylib 0x00007fff88614bba abort + 125
3 libsystem_c.dylib 0x00007fff885dea5f __assert_rtn + 321
4 com.apple.coreui 0x00007fff875aa1a7 CUIRenditionKeySetValueForAttribute + 307
5 com.apple.coreui 0x00007fff875a9004 -[CUIStructuredThemeStore _canGetRenditionWithKey:isFPO:lookForSubstitutions:] + 200
6 com.apple.coreui 0x00007fff875a8f1b -[CUIStructuredThemeStore canGetRenditionWithKey:] + 22
7 com.apple.coreui 0x00007fff875c4eab -[CUICatalog _resolvedRenditionKeyForName:scaleFactor:deviceIdiom:deviceSubtype:] + 291
8 com.apple.coreui 0x00007fff875c4c53 -[CUICatalog imageWithName:scaleFactor:deviceIdiom:deviceSubtype:] + 29
9 com.apple.AppKit 0x00007fff88820b1b +[NSImage _catalogImageWithName:bundle:] + 132
10 com.apple.AppKit 0x00007fff8881aefd +[NSImage imageNamed:] …
Run Code Online (Sandbox Code Playgroud) 问题是,当资源目录下有多个具有给定名称的文件时,imageNamed如何工作?
有没有办法区分具有相同名称(但路径不同)的两个不同文件?
谢谢
在新发布的iOS 5.0 SDK上重新编译我们的iPhone应用程序后,我遇到了一个奇怪的问题 - 所有UIImage:imageNamed(第一次调用实际图像加载)和UIImage:imageWithContentsOfFile开始工作比之前慢10倍.我设法缩小问题:这只是jpeg和png文件(不是GIF!)的情况,这不是因为文件大小.即使直接加载小型32*32 png也需要大约300ms ...相比之下老式设备需要30ms(在3.1和4.3.5上使用完全相同的代码检查)
我还试图通过这个代码通过新引入的CIImage加载图像
WLLog(@"Data loading...");
NSData *imageData = [NSData dataWithContentsOfFile:path];
WLLog(@"CIImage creation...");
CIImage* cii = [CIImage imageWithData:imageData];
WLLog(@"CIImage creation ok...");
float scle = 1.0;
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 40000
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
scle = [[UIScreen mainScreen] scale];
}
#endif
CIContext *context = [CIContext contextWithOptions:nil];
UIImage* res5 = [[UIImage alloc] init];
WLLog(@"UIImage creation...");
[res5 initWithCGImage:[context createCGImage:cii fromRect:cii.extent] scale:scle orientation:UIImageOrientationUp];
WLLog(@"Done!");
Run Code Online (Sandbox Code Playgroud)
没有任何运气......这一行
CIImage* cii = [CIImage imageWithData:imageData];
Run Code Online (Sandbox Code Playgroud)
即使在小图像(4Kb png)上也需要相同的300毫秒.imho,根本没有什么可以解析的!
有没有什么可以解决加载时间这种奇怪的变化?现在它似乎在sdk内部发生了巨大的变化:(
我正在从网上Apple.png和Apple@2x.png下载两张图片.我想使用[UIImage imageNamed:@"Apple.png"]
它,因此它可以使用内置功能来检测它是否应该显示Apple.png或Apple@2x.png.
现在我在哪里存储这些图像?我在文档中阅读了以下内容:
文件的名称.如果这是第一次加载图像,则该方法在应用程序的主包中查找具有指定名称的图像.
啊所以应用程序的主要包是要走的路.这就是我的代码:
NSString *directory = [[NSBundle mainBundle] bundlePath];
NSString *path = [directory stringByAppendingPathComponent:imageName];
NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager createFileAtPath:path contents:dataFetcher.receivedData attributes:nil];
Run Code Online (Sandbox Code Playgroud)
我检查了文件是否在路径的文件夹中创建,这是正确的.我还在我的项目文件中拖了一个Example.png,看看它是否存储在同一个文件夹中,这也是正确的.
但是,[UIImage imageNamed:@"Apple.png"]
仍然无法获取图像.
imagenamed ×10
uiimage ×6
iphone ×4
ios ×3
objective-c ×3
xcode ×3
caching ×1
ios4 ×1
ios5 ×1
ios7 ×1
macos ×1
memory-leaks ×1
nsimage ×1
uiimageview ×1
uikit ×1
xcasset ×1