iOS资源管理
设备指定资源
文件名格式如下:
<basename><device>.<filename_extension>
<basename>表示资源文件的原始名称,也是代码访问该文件的名称;
<filename_extension>就是标准的文件扩展名;
<device>表示设备指定修饰符:
~ipad:只用在iPad设备上
~iphone:只用在iPhone或iPod touch设备上。
资源加载路由:
如果设备指定资源不存在,系统才会去寻找以原始文件名命名的资源文件。
字符串资源
创建字符串资源文件
1、选择需要本地化的字符串
2、字符串加载宏
Core Foundation宏:
CFCopyLocalizedString
CFCopyLocalizedStringFromTable
CFCopyLocalizedStringFromTableInBundle
CFCopyLocalizedStringWithDefaultValue
Foundation宏:
NSLocalizedString
NSLocalizedStringFromTable
NSLocalizedStringFromTableInBundle
NSLocalizedStringWithDefaultValue
上述宏获取当前用户语言首选项对应的字符串值,另外,genstrings工具通过搜索这些宏来构建字符串文件。
3、使用genstrings命令行工具创建字符串文件
genstrings -o en.lproj *.m
-o参数指定输出文件
*.m指定源代码文件名的通配符
格式化字符串资源
使用n$引用源字符串中的指定位置的占位符
/* Message in alert dialog when something fails */
"%@ Error! %@ failed!" = "%2$@ blah blah, %1$@ blah!";
在字符串资源中使用特别字符
转义字符\
Unicode字符\uxxxx(必须传递给genstrings工具-u参数)
调试字符串资源
plutil -lint
图像、声音、剪辑资源
iOS 4.0高分辨率图像文件格式如下:
<basename>@2x.<filename_extension>
Note:@2x修饰符应该在任何设备修饰符之前,其他修饰符(方向、URL模式)之后。
Nib资源
Nib文件一览
Interface对象
Interface对象是添加至Interface Builder文档中实现用户界面的元素。当nib文件在运行时被加载时,Interface对象就是nib加载代码实际创建的对象。
File's Owner
File's Owner对象是个代理对象,并不是在nib文件加载时创建,相反,你需要在自己的代码中创建并传递给nib加载的代码。该对象的重要性体现在其为应用程序代码和nib文件内容的主要连接。特别地,其是负责nib文件内容的控制对象。
First Responder
First Responder对象是个代理对象,表示应用程序动态确定的响应者链的第一个对象。因为不能在设计时就确定应用程序的响应者链,First Responder代理作为响应者链中接受行为消息的替代目标。
Top-Level Objects
Top-Level对象是nib文件加载后,对象图中没有父对象的对象。File’s Owner、First Responder和Application对象是代理对象,不是Top-level对象。
加载Nib文件
通过NSBundle加载
- (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options;
owner参数即File's Owner对象。
返回Top-Level对象的数组。
通过UIViewController加载
- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle;
File's Owner对象为UIViewController对象本身。
Nib文件设计指南
延迟加载——nib文件只包含立即引用的对象,不是加载完成时就引用的对象放在另一个nib文件中,直到实际引用时再加载。
Nib对象的生命周期
加载过程
1、加载nib文件的内容和所有引用资源至内存
●加载归档的整个nib对象图的原始数据
●加载关联的所有自定义的图像资源并加入图像缓存
●加载关联的所有自定义的声音资源并加入声音缓存(iOS是否有?)
2、逆归档对象图并初始化对象
●标准的IB对象(包括这些对象所属类的子类的对象)通过initWithCoder:初始化
在iOS中,任何实现NSCoding协议的对象都通过initWithCoder:方法初始化,包括UIView和UIViewController及其子类
●其他自定义对象通过init方法初始化
3、建立所有nib文件中对象间的连接(包括action、outlet和binding)
●Outlet连接
iOS通过setValue:forKey:方法重建outlet连接,会生成KVO通知。
●Action连接
iOS通过addTarget:action:forControlEvents:方法配制action,如果target为nil,action会被响应者链处理。
●binding
iOS不支持
4、发送awakeFromNib消息给相应的对象,发此消息的顺序无法保证。iOS不发送该消息给File’s Owner、First Responder和其他代理对象。
5、显示所有“Visible at launch time”为真的窗口。
Nib文件的内置支持
可以通过Info.plist文件中的NSMainNibFile关键字指定应用程序加载主窗口Nib文件。
加载时替换代理对象
代理对象表示在nib文件之外创建单与nib文件的内容有连接的对象。
- (void)applicationDidFinishLaunching:(UIApplication *)application {
NSArray* topLevelObjs = nil;
NSDictionary* proxies = [NSDictionary dictionaryWithObject:self forKey:@"AppDelegate"]; // nib文件中的标签
NSDictionary* options = [NSDictionary dictionaryWithObject:proxies forKey:UINibExternalObjects];
topLevelObjs = [[NSBundle mainBundle] loadNibNamed:@"Main" owner:self options:options];
if ([topLevelObjs count] == 0) {
NSLog(@"Warning! Could not load myNib file.\n");
return;
}
// Show window
[window makeKeyAndVisible];
}