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];
            }

   

posted on 2011-05-17 16:28  爱吃草莓的维尼  阅读(1382)  评论(0编辑  收藏  举报

导航