• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            羅朝輝(飄飄白云)

            關(guān)注嵌入式操作系統(tǒng),移動(dòng)平臺(tái),圖形開發(fā)。-->加微博 ^_^

              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              85 隨筆 :: 0 文章 :: 169 評(píng)論 :: 0 Trackbacks
            [Cocoa]深入淺出 Cocoa 之 Framework
            CC許可,轉(zhuǎn)載請(qǐng)注明出處

            Framework 簡(jiǎn)介

            Mac OS X 擴(kuò)展了 framework 的功能,讓我們能夠利用它來(lái)共享代碼和資源。framework 在概念上有點(diǎn)像 Window 下的庫(kù),但是比庫(kù)更加強(qiáng)大,通過(guò) framework 我們可以共享所有形式的資源,如動(dòng)態(tài)共享庫(kù),nib 文件,圖像字符資源以及文檔等。系統(tǒng)會(huì)在需要的時(shí)候?qū)?framework 載入內(nèi)存中,多個(gè)應(yīng)用程序可以同時(shí)使用同一個(gè) framework,而內(nèi)存中的拷貝只有一份。一個(gè) framework 同時(shí)也是一個(gè) bundle,我們可以在 finder 里瀏覽其內(nèi)容,也可以在代碼中通過(guò) NSBundle 訪問(wèn)它。利用 framework 我們可以實(shí)現(xiàn)動(dòng)態(tài)或靜態(tài)庫(kù)的功能。與動(dòng)態(tài)/靜態(tài)庫(kù)相比,framework 有如下優(yōu)勢(shì):

            第一,framework 能將不同類型的資源打包在一起,使之易于安裝,卸載與定位;
            第二,framework 能夠進(jìn)行版本管理,這使得 framework 能不斷更新并向后兼容;
            第三,在同一時(shí)間,即使有多個(gè)應(yīng)用程序使用同一 framework,但在內(nèi)存中只有一份 framework 只讀資源的拷貝,這減少了對(duì)內(nèi)存的占用

            Framework 的結(jié)構(gòu)

            下面是一個(gè)帶有A,B兩個(gè)版本和一個(gè) resources 目錄的 framework 結(jié)構(gòu),并設(shè)定當(dāng)前版本為 B:

            MyFramework.framework/
                Headers      
            -> Versions/Current/Headers
                MyFramework  
            -> Versions/Current/MyFramework
                Resources    
            -> Versions/Current/Resources
                Versions
            /
                    A
            /
                        Headers
            /
                            MyHeader.h
                        MyFramework
                        Resources
            /
                            English.lproj
            /
                                Documentation
                                InfoPlist.strings
                            Info.plist
                    B
            /
                        Headers
            /
                            MyHeader.h
                        MyFramework
                        Resources
            /
                            English.lproj
            /
                                Documentation
                                InfoPlist.strings
                            Info.plist
                    Current  
            -> B

             

             結(jié)合上面的結(jié)構(gòu),下面我們來(lái)看本例中 ExampleFramework 的結(jié)構(gòu)圖:

            Framework 存放位置
            在 Mac OS 中有三個(gè)級(jí)別的位置來(lái)存放 framework。一般我們自己編寫的 framework 都應(yīng)該是應(yīng)用程序級(jí)別。
            1,系統(tǒng)級(jí),/Library/Frameworks,放置到該級(jí)別,這需要管理員權(quán)限,整個(gè)系統(tǒng)都可以共享使用該級(jí)別的 framework;
            2,用戶級(jí),/Users/用戶名/Library/Frameworks,擁有用戶權(quán)限的應(yīng)用程序都可以共享使用該級(jí)別的 framework;
            3,應(yīng)用程序級(jí)。

            在應(yīng)用程序中內(nèi)嵌 Framework

            1,創(chuàng)建 Framework
            新建一個(gè)名為 FrameworkDemo 的 Cocoa application 工程,然后選中項(xiàng)目名,向其中添加名為 ExampleFramework  的 Cocoa Framework。

            2,添加內(nèi)容
            向 Framework 中添加源代碼(請(qǐng)下載源代碼),并導(dǎo)出需要向外部公開的頭文件。

            導(dǎo)出頭文件有一些技巧:
            1,如果有我們不想向用戶公開的類名出現(xiàn)在必須公開的頭文件中,我們可以使用 id 替代該類名或使用 @class 前置申明來(lái)避免導(dǎo)出該類的頭文件,在本例中使用 id 替代 InternalObject,從而避免導(dǎo)出 InternalObject 類的頭文件。
            2,如果需要導(dǎo)出多個(gè)頭文件,常見的做法是新建一個(gè)與 framework 同名的 .h 文件,將需要導(dǎo)出的頭文件包含到該頭文件中來(lái)。如本例中的  ExampleFramework.h。

            3,修改 framework build 選項(xiàng)
            我們?cè)谑褂米约壕帉懙膸?kù)時(shí),常碰到下面的編譯錯(cuò)誤:

            Library not loaded: path/to/framework
            Referenced from: path/to/app/
            Reason: image not found
            這多半是由于 framework 的 Installation Directory 編譯選項(xiàng)設(shè)置不正確,導(dǎo)致應(yīng)用程序無(wú)法正確定位 framework 所致。這需要我們?cè)O(shè)置編譯選項(xiàng) Installation Directory 為 @executable_path/../Frameworks。

            4,使用 framework
            至此,framework 編寫完成,下面我們來(lái)在 FrameworkDemo 中來(lái)使用它。首先我們需要將 ExampleFramework 導(dǎo)入到 FrameworkDemo 中來(lái),這樣 FrameworkDemo 在運(yùn)行時(shí)才能定位該 framework。新建一個(gè) Add copy files 型的 build phase,設(shè)置其 destination 為 framework,加入已經(jīng)編寫好的 ExampleFramework。

            導(dǎo)入 framework 之后,我們就可以在工程中使用該 framework 了。編寫如下代碼:

            //
            //  FrameworkDemoAppDelegate.m
            //  FrameworkDemo
            //
            //  Created by kesalin on 11-10-16.
            //  Copyright 2011年 kesalin@gmail.com. All rights reserved.
            //
            
            #import "FrameworkDemoAppDelegate.h"
            #import <ExampleFramework/ExampleFramework.h>
            
            @implementation FrameworkDemoAppDelegate
            
            @synthesize window;
            
            - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
            {
                    EntityObjectA *objectA = [[EntityObjectA alloc] init];
            	EntityObjectB *objectB = [[EntityObjectB alloc] init];
            	
            	NSLog(@"Object A called: %@", [objectA methodOne]);
            	NSLog(@"Object B called: %@", [objectA methodTwo]);
            	
            	NSLog(@"Object B called: %@", [objectB methodOne]);
            	NSLog(@"Object B called: %@", [objectB methodTwo]);
            }
            
            @end
            注意:我們使用 framework 的方式為 :framework名/framework名.h,這是約定的常規(guī)做法,Cocoa 自帶的 framework 也都遵守這一約定,所以我們自己編寫的庫(kù)最后也遵守這一約定。

            5,編譯運(yùn)行
            至此,工作完成,編譯運(yùn)行,應(yīng)當(dāng)輸出如下:

            Object A called: EntityObjectA:methodOne
            Object B called: EntityObjectA:methodTwo - InternalObject:description
            Object B called: EntityObjectB:methodOne
            Object B called: EntityObjectB:methodTwo - InternalObject:description

            6,清除冗余文件
            這時(shí)可選項(xiàng),且只對(duì)使用內(nèi)嵌 framework 的應(yīng)用程序有效。當(dāng)我們拷貝導(dǎo)入 framework 之后,應(yīng)用程序 bundle 已經(jīng)拷貝了一份 framework,那么原本編譯生成的那一份 framework就變得多余了,我們可以將其清理掉。在使用內(nèi)嵌 framework 的應(yīng)用程序的 build phases 中加入 run script phase,腳本內(nèi)容如下:
            echo "build path ${TARGET_BUILD_DIR}"
            cd ${TARGET_BUILD_DIR}/${FULL_PRODUCT_NAME}/Contents/Frameworks 
            rm -rf */Headers 
            rm -rf */Versions/*/Headers
            rm -rf */Versions/*/PrivateHeaders 
            rm -rf */Versions/*/Resources/*/Contents/Headers


            使用外部 framework

            上面的示例是在應(yīng)用程序內(nèi)嵌 framework,供應(yīng)用程序本身使用,很多時(shí)候,我們是使用第三方編寫的 framework,下面接著來(lái)演示如何將 ExampleFramework 當(dāng)做外部framework。
            1,新建名為 TestExampleFramework 的 Cocoa Application 程序,在 TestExampleFrameworkAppDelegate.m 中添加如上步驟 4 中使用 framework 的代碼。

            2,編譯運(yùn)行,這時(shí)會(huì)報(bào)找不到頭文件,類名的錯(cuò)誤。這時(shí)因?yàn)槲覀冞€沒有導(dǎo)入framework。在 Build Phase 的 Link Binary With Libraries 中加入生成好的 ExampleFramework,該 framework 的默認(rèn)生成路徑在: /用戶名/Library/Developer/XCode/DerivedData/FrameworkDemo-XXXX/Build/Products/Debug/下。至此,編譯運(yùn)行,輸出應(yīng)當(dāng)如上步驟 5 相同。


            此外還有一種方式使用第三方 framework,如果我們擁有第三方 framework 的源代碼工程,想在我們的工程中編譯該 framework,并使用它。我們可以將第三方 framework 的工程文件加入我們自己的工程,并在 Target Dependencies 和 Link Binary With Libraires 加入第三方 framework,這樣我們就可以使用該 framework了。如下圖所示:


            posted on 2011-10-16 14:10 羅朝輝 閱讀(4418) 評(píng)論(3)  編輯 收藏 引用 所屬分類: Cocoa 開發(fā)

            評(píng)論

            # re: [Cocoa]深入淺出 Cocoa 之 Framework 2011-10-16 21:30 glueless human hair lace front wigs
            學(xué)習(xí)了啊,相當(dāng)深入啊,收藏  回復(fù)  更多評(píng)論
              

            # re: [Cocoa]深入淺出 Cocoa 之 Framework 2012-05-30 15:01 cokecoffe
            留著,備用  回復(fù)  更多評(píng)論
              

            # re: [Cocoa]深入淺出 Cocoa 之 Framework 2012-11-12 12:15 十口心思
            你牛逼啊,從哪去學(xué)到這么多東西的?  回復(fù)  更多評(píng)論
              

            久久精品国产亚洲av麻豆小说| 欧美精品福利视频一区二区三区久久久精品 | 久久久久国产精品人妻| 久久久久久午夜精品| 久久久噜噜噜久久熟女AA片| 国产欧美一区二区久久| 久久久久国产一级毛片高清板| 久久亚洲日韩看片无码| 99久久精品免费| 久久热这里只有精品在线观看| 狠狠色丁香婷婷综合久久来| 亚洲欧美日韩精品久久亚洲区| 久久亚洲精品中文字幕| 天天综合久久一二三区| 秋霞久久国产精品电影院| 色播久久人人爽人人爽人人片AV| 狠狠色丁香婷综合久久| 久久久久亚洲国产| 久久久久99精品成人片牛牛影视| 久久精品国产精品亚洲毛片 | 人人狠狠综合88综合久久| 国产精品久久波多野结衣| 中文字幕久久波多野结衣av| 久久99精品国产麻豆蜜芽| 2022年国产精品久久久久| 亚洲AV无码成人网站久久精品大| 国产精品99久久久久久宅男| 久久精品欧美日韩精品| 国内精品伊人久久久久777| 日日狠狠久久偷偷色综合0| 久久996热精品xxxx| 91亚洲国产成人久久精品网址| 国产成人久久精品一区二区三区| 综合久久国产九一剧情麻豆| 久久精品成人欧美大片| 成人午夜精品无码区久久| 99久久免费国产精品特黄| 亚洲日韩欧美一区久久久久我| 色狠狠久久综合网| 久久久国产99久久国产一| 色狠狠久久综合网|