iOS 動(dòng)態(tài)庫(kù)與靜態(tài)庫(kù)

聲明: 原文鏈接

動(dòng)態(tài)庫(kù) 與 靜態(tài)庫(kù)

  • 使用靜態(tài)庫(kù)的好處

    • 1,模塊化赔癌,分工合作
    • 2蔫仙,避免少量改動(dòng)經(jīng)常導(dǎo)致大量的重復(fù)編譯連接
    • 3哀卫,也可以重用巨坊,注意不是共享使用
  • 使用動(dòng)態(tài)庫(kù)的好處

    • 1.使用動(dòng)態(tài)庫(kù),可以將最終可執(zhí)行文件體積縮小
    • 2.使用動(dòng)態(tài)庫(kù)此改,多個(gè)應(yīng)用程序共享內(nèi)存中得同一份庫(kù)文件趾撵,節(jié)省資源
    • 3.使用動(dòng)態(tài)庫(kù),可以不重新編譯連接可執(zhí)行程序的前提下共啃,更新動(dòng)態(tài)庫(kù)文件達(dá)到更新應(yīng)用程序的目的占调。

從1可以得出,將整個(gè)應(yīng)用程序分模塊移剪,團(tuán)隊(duì)合作究珊,進(jìn)行分工,影響比較小纵苛。 等其他好處剿涮,從2可以看出,其實(shí)動(dòng)態(tài)庫(kù)應(yīng)該叫共享庫(kù)攻人,那么從這個(gè)意義上來(lái)說(shuō)取试,蘋(píng)果禁止iOS開(kāi)發(fā)中使用動(dòng)態(tài)庫(kù)就可以理解了: 因?yàn)樵诂F(xiàn)在的iPhone,iPodTouch怀吻,iPad上面程序都是單進(jìn)程的瞬浓,也就是某一時(shí)刻只有一個(gè)進(jìn)程在運(yùn)行,那么你寫(xiě)個(gè)共享庫(kù)蓬坡,
—-共享給誰(shuí)瑟蜈?(你使用的時(shí)候只有你一個(gè)應(yīng)用程序存在,其他的應(yīng)該被掛起了渣窜,即便是可以同時(shí)多個(gè)進(jìn)程運(yùn)行,別人能使用你的共享庫(kù)里的東西嗎宪躯?你這個(gè)是給你自己的程序定制的乔宿。)
—-目前蘋(píng)果的AppStore不支持模塊更新,無(wú)法更新某個(gè)單獨(dú)文件(除非自己寫(xiě)一個(gè)更新機(jī)制:有自己的服務(wù)端放置最新動(dòng)態(tài)庫(kù)文件) 至于蘋(píng)果為啥禁止ios開(kāi)發(fā)使用動(dòng)態(tài)庫(kù)我就猜到上面?zhèn)z原因

深入理解iPhone靜態(tài)庫(kù)

在實(shí)際的編程過(guò)程中访雪,通常會(huì)把一些公用函數(shù)制成函數(shù)庫(kù)详瑞,供其它程序使用,一則提搞了代碼的復(fù)用臣缀;二則提搞了核心技術(shù)的保密程度坝橡。所以在實(shí)際的項(xiàng)目開(kāi)發(fā)中,經(jīng)常會(huì)使用到函數(shù)庫(kù)精置,函數(shù)庫(kù)分為靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)兩種计寇。和多數(shù)人所熟悉的動(dòng)態(tài)語(yǔ)言和靜態(tài)語(yǔ)言一樣,這里的所謂靜態(tài)和動(dòng)態(tài)是相對(duì)編譯期和運(yùn)行期的:靜態(tài)庫(kù)在程序編譯時(shí)會(huì)被鏈接到目標(biāo)代碼中,程序運(yùn)行時(shí)將不再需要改靜態(tài)庫(kù)番宁;而動(dòng)態(tài)庫(kù)在程序編譯時(shí)并不會(huì)被鏈接到目標(biāo)代碼中元莫,只是在程序運(yùn)行時(shí)才被載入,因?yàn)樵诔绦蜻\(yùn)行期間還需要?jiǎng)討B(tài)庫(kù)的存在蝶押。

iPhone官方只支持靜態(tài)庫(kù)聯(lián)編踱蠢。

  • 深入理解framework(框架,其實(shí)相當(dāng)于靜態(tài)框架棋电,不是動(dòng)態(tài)庫(kù))
    打包framework還是一個(gè)比較重要的功能茎截,可以用來(lái)做一下事情:
    (1)封裝功能模塊,比如有比較成熟的功能模塊封裝成一個(gè)包赶盔,然后以后自己或其他同事用起來(lái)比較方便企锌。
    (2)封裝項(xiàng)目,有時(shí)候會(huì)遇到這個(gè)情況招刨,就是一家公司找了兩個(gè)開(kāi)發(fā)公司做兩個(gè)項(xiàng)目霎俩,然后要求他們的項(xiàng)目中的一個(gè)嵌套進(jìn)另一個(gè)項(xiàng)目,此時(shí)也可以把唄嵌套的項(xiàng)目打包成framework放進(jìn)去沉眶,這樣比較方便打却。

  • 我們?yōu)槭裁葱枰蚣埽‵ramework)?
    要想用一種開(kāi)發(fā)者友好的方式共享庫(kù)是很麻煩的谎倔。你不僅僅需要包含庫(kù)本身柳击,還要加入所有的頭文件,資源等等片习。
    蘋(píng)果解決這個(gè)問(wèn)題的方式是框架(framework)捌肴。基本上藕咏,這是含有固定結(jié)構(gòu)并包含了引用該庫(kù)時(shí)所必需的所有東西的文件夾状知。不幸的是,iOS禁止所有的動(dòng)態(tài)庫(kù)孽查。同時(shí)饥悴,蘋(píng)果也從Xcode中移除了創(chuàng)建靜態(tài)iOS框架的功能。Xcode仍然可以支持創(chuàng)建框架的功能盲再,重啟這個(gè)功能西设,我們需要對(duì)Xcode做一些小小的改動(dòng)。
    把代碼封裝在靜態(tài)框架是被app store所允許的答朋。盡管形式不同贷揽,本質(zhì)上它仍然是一種靜態(tài)庫(kù)。

  • 框架(Framework)的類(lèi)別
    大部分框架都是動(dòng)態(tài)鏈接庫(kù)的形式梦碗。因?yàn)橹挥刑O(píng)果才能在iOS設(shè)備上安裝動(dòng)態(tài)庫(kù)禽绪,所以我們無(wú)法創(chuàng)建這種類(lèi)型的框架蓖救。
    靜態(tài)鏈接庫(kù)和動(dòng)態(tài)庫(kù)一樣,只不過(guò)它是在編譯時(shí)鏈接二進(jìn)制代碼丐一,因此使用靜態(tài)庫(kù)不會(huì)有動(dòng)態(tài)庫(kù)那樣的問(wèn)題(即除了蘋(píng)果誰(shuí)也不能在iOS上使用動(dòng)態(tài)庫(kù))藻糖。
    “偽”框架是通過(guò)破解Xcode的目標(biāo)Bundle(使用某些腳本)來(lái)實(shí)現(xiàn)的。它在表面上以及使用時(shí)跟靜態(tài)框架并無(wú)區(qū)別库车【奁猓“偽”框架項(xiàng)目的功能幾乎和真實(shí)的框架項(xiàng)目沒(méi)有區(qū)別(不是全部)。
    “嵌入”框架是靜態(tài)框架的一個(gè)包裝柠衍,以便Xcode能獲取框架內(nèi)的資源(圖片洋满、plist、nib等)珍坊。

本次發(fā)布包括了創(chuàng)建靜態(tài)框架和“偽”框架的模板牺勾,以及二者的“嵌入”框架。

用哪一種模板阵漏?本次發(fā)布有兩個(gè)模板驻民,每個(gè)模板都有“強(qiáng)”“弱”兩個(gè)類(lèi)別。你可以選擇最適合一種(或者兩種都安裝上)履怯。 最大的不同是Xcode不能創(chuàng)建“真”框架回还,除非你安裝靜態(tài)框架文件xcspec在Xcode中。這真是一個(gè)遺憾(這個(gè)文件是給項(xiàng)目使用的叹洲,而不是框架要用的)柠硕。

簡(jiǎn)單說(shuō),你可以這樣決定用哪一種模板:
如果你不想修改Xcode运提,那么請(qǐng)使用“偽”框架版本
如果你只是想共享二進(jìn)制(不是項(xiàng)目)蝗柔,兩種都可以
如果你想把框架共享給不想修改Xcode的開(kāi)發(fā)者,使用“偽”框架版本
如果你想把框架共享給修改過(guò)Xcode的開(kāi)發(fā)者民泵,使用“真”框架版本
如果你想把框架項(xiàng)目作為另一個(gè)項(xiàng)目的依賴(lài)(通過(guò)workspace或者子項(xiàng)目的方式)癣丧,請(qǐng)使用“真”框架(或者“偽”框架,使用-framework——見(jiàn)后)
如果你想在你的框架項(xiàng)目中加入其他靜態(tài)庫(kù)/框架栈妆,并把它們也鏈接到最終結(jié)果以便不需要單獨(dú)添加到用戶(hù)項(xiàng)目中胁编,使用“偽”框架

  • “偽”框架
    “偽”框架是破解的“reloacatable object file”(可重定位格式的目標(biāo)文件, 保存著代碼和數(shù)據(jù)签钩,適合于和其他的目標(biāo)文件連接到一起,用來(lái)創(chuàng)建一個(gè)可執(zhí)行目標(biāo)文件或者是一個(gè)可共享目標(biāo)文件)坏快,它可以讓Xcode編譯出類(lèi)似框架的東西——其實(shí)也是一個(gè)bundle铅檩。
    “偽框架”模板把整個(gè)過(guò)程分為幾個(gè)步驟,用某些腳本去產(chǎn)生一個(gè)真正的靜態(tài)框架(基于靜態(tài)庫(kù)而不是reloacatable object file)莽鸿。而且昧旨,框架項(xiàng)目還是把它定義為wrapper.cfbundle類(lèi)型拾给,一種Xcode中的“二等公民”。
    因此它跟“真”靜態(tài)框架一樣可以正常工作兔沃,但當(dāng)存在依賴(lài)關(guān)系時(shí)就有麻煩了蒋得。

  • 依賴(lài)問(wèn)題
    如果不使用依賴(lài),只是創(chuàng)建普通的項(xiàng)目是沒(méi)有任何問(wèn)題的乒疏。但是如果使用了項(xiàng)目依賴(lài)(比如在workspace中)额衙,Xcode就悲劇了。當(dāng)你點(diǎn)擊“Link Binary With Libraries”下方的’+’按鈕時(shí)怕吴,“偽框架”無(wú)法顯示在列表中窍侧。你可以從你的“偽”框架項(xiàng)目的Products下面將它手動(dòng)拖入,但當(dāng)你編輯你的主項(xiàng)目時(shí)转绷,會(huì)出現(xiàn)警告:

    warning: skipping file ‘/somewhere/MyFramework.framework’ (unexpectedfile type ‘wrapper.cfbundle’ in Frameworks & Libraries build phase)
    

    并伴隨“偽”框架中的鏈接錯(cuò)誤伟件。幸運(yùn)的是,有個(gè)辦法來(lái)解決它议经。你可以在”O(jiān)ther Linker Flags”中用”-framwork”開(kāi)關(guān)手動(dòng)告訴linker去使用你的框架進(jìn)行鏈接:

       -framework MyFramework
    

警告仍然存在斧账,但起碼能正確鏈接了。

  • 添加其他的庫(kù)/框架
    如果你加入其他靜態(tài)(不是動(dòng)態(tài))庫(kù)/框架到你的“偽”框架項(xiàng)目中煞肾,它們將“鏈接”進(jìn)你最終的二進(jìn)制框架文件中咧织。在“真”框架項(xiàng)目中,它們是純引用扯旷,而不是鏈接拯爽。你可以在項(xiàng)目中僅僅包含頭文件而不是靜態(tài)庫(kù)/框架本身的方式避免這種情況(以便編譯通過(guò))。

  • “真”框架
    “真”框架各個(gè)方面都符合“真”的標(biāo)準(zhǔn)钧忽。它是真正的靜態(tài)框架毯炮,正如使用蘋(píng)果在從Xcode中去除的那個(gè)功能所創(chuàng)建的一樣。為了能創(chuàng)建真正的靜態(tài)框架項(xiàng)目耸黑,你必需在Xcode中安裝一個(gè)xcspec文件桃煎。
    如果你發(fā)布一個(gè)“真”框架項(xiàng)目(而不是編譯),希望去編譯這個(gè)框架的人必需也安裝xcspec文件(使用本次發(fā)布的安裝腳本)大刊,以便Xcode能理解目標(biāo)類(lèi)型为迈。
    注意:如果你正在發(fā)布完全編譯的框架,而不是框架項(xiàng)目缺菌,最終用戶(hù)并不需要安裝任何東西葫辐。
    我已經(jīng)提交一個(gè)報(bào)告給蘋(píng)果,希望他們?cè)赬code中更新這個(gè)文件伴郁,但那需要一點(diǎn)時(shí)間.OpenRadarlink here

  • 加其他靜態(tài)庫(kù)/框架
    如果你加入其他靜態(tài)(不是動(dòng)態(tài))庫(kù)/框架到你的“真”框架項(xiàng)目耿战,它們只會(huì)被引用,而不會(huì)象“偽”框架一樣被鏈接到最終的二進(jìn)制文件中焊傅。

  • 從早期版本升級(jí)
    如果你是從Mk6或者更早的版本升級(jí)剂陡,同時(shí)使用“真”靜態(tài)框架狈涮,并且使用Xcode4.2.1以前的版本,請(qǐng)運(yùn)行uninstall_legacy.sh以卸載早期用于Xcode的所有修正鸭栖。然后再運(yùn)行install.sh歌馍,重啟Xcode。如果你使用Xcode4.3以后晕鹊,只需要運(yùn)行install.sh并重啟Xcode松却。

  • 安裝
    分別運(yùn)行Real Framework目錄或Fake Framework目錄下的install.sh腳本進(jìn)行安裝(或者兩個(gè)你都運(yùn)行)。
    重啟Xcode捏题,你將在新項(xiàng)目向?qū)У腇ramework&Library下看到StaticiOS Framework(或者Fake Static iOS Framework)玻褪。
    卸載請(qǐng)運(yùn)行unistall.sh腳本并重啟Xcode。

  • 創(chuàng)建一個(gè)iOS框架項(xiàng)目

  1. 創(chuàng)建新項(xiàng)目公荧。
    項(xiàng)目類(lèi)型選擇Framework&Library下的Static iOS Framework(或者Fake Static iOS Framework)選擇“包含單元測(cè)試”(可選的) 在target中加入類(lèi)带射、資源等。 凡是其他項(xiàng)目要使用的頭文件循狰,必需聲明為public窟社。進(jìn)入target的Build Phases頁(yè),展開(kāi)Copy Headers項(xiàng)绪钥,把需要public的頭文件從Project或Private部分拖拽到Public部分灿里。

  2. 編譯你的 iOS 框架
    選擇指定target的scheme
    修改scheme的Run配置(可選)。Run配置默認(rèn)使用Debug程腹,但在準(zhǔn)備部署的時(shí)候你可能想使用Release匣吊。

  3. 編譯框架(無(wú)論目標(biāo)為iOS device和Simulator都會(huì)編譯出相同的二進(jìn)制,因此選誰(shuí)都無(wú)所謂了)寸潦。
    從Products下選中你的framework色鸳,“show in Finder”。在build目錄下有兩個(gè)文件夾:(yourframework).framework and (your framework).embeddedframework. 如果你的框架只有代碼见转,沒(méi)有資源(比如圖片命雀、腳本、xib斩箫、coredata的momd文件等)吏砂,你可以把 (yourframework).framework 分發(fā)給你的用戶(hù)就行了。如果還包含有資源乘客,你必需分發(fā) (your framework).embeddedframework 給你的用戶(hù)狐血。
    為什么需要embedded framework?因?yàn)閄code不會(huì)查找靜態(tài)框架中的資源易核,如果你分發(fā)(your framework).framework, 則框架中的所有資源都不會(huì)顯示匈织,也不可用。
    一個(gè)embedded framework只是一個(gè)framework之外的附加的包耸成,包括了這個(gè)框架的所有資源的符號(hào)鏈接报亩。這樣做的目的是讓Xcode能夠找到這些資源。

使用iOS 框架

iOS框架和常規(guī)的Mac OS動(dòng)態(tài)框架差不多井氢,只是它是靜態(tài)鏈接的而已弦追。

在你的項(xiàng)目中使用一個(gè)框架,只需把它拖僅你的項(xiàng)目中花竞。在包含頭文件時(shí)劲件,記住使用尖括號(hào)而不是雙引號(hào)括住框架名稱(chēng)。例如约急,對(duì)于框架MyFramework:

  #import <MyFramework/MyClass.h>
  • 使用問(wèn)題

    Headers Not Found
    

    如果Xcode找不到框架的頭文件零远,你可能是忘記將它們聲明為public了。參考“創(chuàng)建一個(gè)iOS框架項(xiàng)目”第5步厌蔽。

    No Such Product Type
    

    如果你沒(méi)有安裝iOS Universal Framework在Xcode牵辣,并企圖編譯一個(gè)universal框架項(xiàng)目(對(duì)于“真”框架,不是“假”框架)奴饮,這會(huì)導(dǎo)致下列錯(cuò)誤:

     target specifies product type ‘com.apple.product-type.framework.static’,but there’s no such product type for the ‘iphonesimulator’ platform
    

    為了編譯“真”iOS靜態(tài)框架纬向,Xcode需要做一些改動(dòng),因此為了編譯“真”靜態(tài)框架項(xiàng)目戴卜,請(qǐng)?jiān)谒械拈_(kāi)發(fā)環(huán)境中安裝它(對(duì)于使用框架的用戶(hù)不需要逾条,只有要編譯框架才需要)。

    The selected run destination is not valid for this action
    

    有時(shí)投剥,Xcode出錯(cuò)并加載了錯(cuò)誤的active設(shè)置师脂。首先,請(qǐng)嘗試重啟Xcode江锨。如果錯(cuò)誤繼續(xù)存在吃警,Xcode產(chǎn)生了一個(gè)壞的項(xiàng)目(因?yàn)閄code4的一個(gè)bug,任何類(lèi)型的項(xiàng)目都會(huì)出現(xiàn)這個(gè)問(wèn)題)泳桦。如果是這樣汤徽,你需要?jiǎng)?chuàng)建一個(gè)新項(xiàng)目重來(lái)一遍。

  • 鏈接警告

第一次編譯框架target時(shí)灸撰,Xcdoe會(huì)在鏈接階段報(bào)告找不到文件夾:

  ld: warning: directory not found for option'-L/Users/myself/Library/Developer/Xcode/DerivedData/MyFramework-ccahfoccjqiognaqraesrxdyqcne/Build/Products/Debug-iphoneos'

此時(shí)谒府,可以clean并重新編譯target,警告會(huì)消除浮毯。

  Core Data momd not found

對(duì)于框架項(xiàng)目和應(yīng)用程序項(xiàng)目完疫,Xcode會(huì)以不同的方式編譯momd(托管對(duì)象模型文件)。Xcode會(huì)簡(jiǎn)單地在根目錄創(chuàng)建.mom文件债蓝,而不會(huì)創(chuàng)建一個(gè).momd目錄(目錄中包含VersionInfo.plist和.mom文件)壳鹤。

這意味著,當(dāng)從一個(gè)embedded framework的model中實(shí)例化NSManagedObjectModel時(shí)饰迹,你必需使用.mom擴(kuò)展名作為model的URL芳誓,而不是采用.momd擴(kuò)展名余舶。

  NSURL *modelURL = [[NSBundle mainBundle]URLForResource:@"MyModel" withExtension:@"mom"];
  Unknown class MyClass in Interface Builder file.

由于靜態(tài)框架采用靜態(tài)鏈接,linker會(huì)剔除所有它認(rèn)為無(wú)用的代碼锹淌。不幸的是匿值,linker不會(huì)檢查xib文件,因此如果類(lèi)是在xib中引用赂摆,而沒(méi)有在O-C代碼中引用挟憔,linker將從最終的可執(zhí)行文件中刪除類(lèi)。這是linker的問(wèn)題烟号,不是框架的問(wèn)題(當(dāng)你編譯一個(gè)靜態(tài)庫(kù)時(shí)也會(huì)發(fā)生這個(gè)問(wèn)題)绊谭。蘋(píng)果內(nèi)置框架不會(huì)發(fā)生這個(gè)問(wèn)題,因?yàn)樗麄兪沁\(yùn)行時(shí)動(dòng)態(tài)加載的汪拥,存在于iOS設(shè)備固件中的動(dòng)態(tài)庫(kù)是不可能被刪除的达传。

有兩個(gè)解決的辦法:

讓框架的最終用戶(hù)關(guān)閉linker的優(yōu)化選項(xiàng),通過(guò)在他們的項(xiàng)目的Other Linker Flags中添加-ObjC和-all_load迫筑。
在框架的另一個(gè)類(lèi)中加一個(gè)該類(lèi)的代碼引用趟大。例如,假設(shè)你有個(gè)MyTextField類(lèi)铣焊,被linker剔除了逊朽。假設(shè)你還有一個(gè)MyViewController,它在xib中使用了MyTextField曲伊,MyViewController并沒(méi)有被剔除叽讳。你應(yīng)該這樣做:

在MyTextField中:
+ (void)forceLinkerLoad_ {}
在MyViewController中:
+(void) initialize {[MyTextField forceLinkerLoad_]; }
他們?nèi)匀恍枰砑?ObjC到linker設(shè)置,但不需要強(qiáng)制all_load了坟募。

第2種方法需要你多做一點(diǎn)工作岛蚤,但卻讓最終用戶(hù)避免在使用你的框架時(shí)關(guān)閉linker優(yōu)化( 關(guān)閉linker優(yōu)化會(huì)導(dǎo)致object文件膨脹 )。

unexpected file type ‘wrapper.cfbundle’ in Frameworks &Libraries build phase

這個(gè)問(wèn)題發(fā)生在把“假”框架項(xiàng)目作為workspace的依賴(lài)懈糯,或者把它當(dāng)作子項(xiàng)目時(shí)(“真”框架項(xiàng)目沒(méi)有這個(gè)問(wèn)題)涤妒。盡管這種框架項(xiàng)目產(chǎn)生了正確的靜態(tài)框架,但Xcode只能從項(xiàng)目文件中看出這是一個(gè)bundle赚哗,因此它在檢查依賴(lài)性時(shí)發(fā)出一個(gè)警告她紫,并在linker階段跳過(guò)它。

你可以手動(dòng)添加一個(gè)命令讓linker在鏈接階段能正確鏈接屿储。在依賴(lài)你的靜態(tài)框架的項(xiàng)目的OtherLinker Flags中加入:

  -framework MyFramework

警告仍然存在, 但不會(huì)導(dǎo)致鏈接失敗贿讹。

  Libraries being linked or not being linked into the finalframework

很不幸, “真”框架和“假”框架模板在處理引入的靜態(tài)庫(kù)/框架的工作方式不同的够掠。
“真”框架模板采用正常的靜態(tài)庫(kù)生成步驟民褂,不會(huì)鏈接其他靜態(tài)庫(kù)/框架到最終生物中。
“假”框架模板采用“欺騙”Xcode的手段,讓它認(rèn)為是在編譯一個(gè)可重定位格式的目標(biāo)文件赊堪,在鏈接階段就如同編譯一個(gè)可執(zhí)行文件面殖,把所有的靜態(tài)代碼文件鏈接到最終生成物中(盡管不會(huì)檢查是否確實(shí)目標(biāo)代碼)。為了實(shí)現(xiàn)象“真”框架一樣的效果哭廉,你可以只包含庫(kù)/框架的頭文件到你的項(xiàng)目中畜普,而不需要包含庫(kù)/框架本身。

  Unrecognized selector in (some class with a category method)

如果你的靜態(tài)庫(kù)或靜態(tài)框架包含了一個(gè)模塊(只在類(lèi)別代碼中聲明群叶,沒(méi)有類(lèi)實(shí)現(xiàn)),linker會(huì)搞不清楚钝荡,并把代碼從二進(jìn)制文件中剔除街立。因?yàn)樵谧罱K生成的文件中沒(méi)有這個(gè)方法,所以當(dāng)調(diào)用這個(gè)類(lèi)別中定義的方法時(shí)埠通,會(huì)報(bào)一個(gè)“unrecognizedselector”異常赎离。

要解決這個(gè),在包含這個(gè)類(lèi)別的模塊代碼中加一個(gè)“假的”類(lèi)端辱。linker發(fā)現(xiàn)存在完整的O-C類(lèi)梁剔,會(huì)將類(lèi)別代碼鏈接到模塊。
我寫(xiě)了一個(gè)頭文件 LoadableCategory.h舞蔽,以減輕這個(gè)工作量:

  #import "SomeConcreteClass+MyAdditions.h"
  #import "LoadableCategory.h"  MAKE_CATEGORIES_LOADABLE(SomeConcreteClass_MyAdditions);
   @implementation SomeConcreteClass(MyAdditions)
  ...
  @end

在使用這個(gè)框架時(shí)荣病,仍然還需要在Build Setting的Other Linker Flags中加入-ObjC。

執(zhí)行任何代碼前單元測(cè)試崩潰

如果你在Xcode4.3中創(chuàng)建靜態(tài)框架(或庫(kù))target時(shí)渗柿,勾選了“withunit tests”个盆,當(dāng)你試圖運(yùn)行單元測(cè)試時(shí),它會(huì)崩潰:

  Thread 1: EXC_BAD_ACCESS (code=2, address=0x0) 0 0x00000000 — 15 dyldbootstrap:start(…)

這是lldb中的一個(gè)bug朵栖。你可以用GDB來(lái)運(yùn)行單元測(cè)試颊亮。編輯scheme,選擇Test陨溅,在Info標(biāo)簽中將調(diào)試器Debugger從LLDB改為GDB终惑。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市门扇,隨后出現(xiàn)的幾起案子雹有,更是在濱河造成了極大的恐慌,老刑警劉巖臼寄,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件件舵,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡脯厨,警方通過(guò)查閱死者的電腦和手機(jī)铅祸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人临梗,你說(shuō)我怎么就攤上這事涡扼。” “怎么了盟庞?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵吃沪,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我什猖,道長(zhǎng)票彪,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任不狮,我火速辦了婚禮降铸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘摇零。我一直安慰自己推掸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布驻仅。 她就那樣靜靜地躺著谅畅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪噪服。 梳的紋絲不亂的頭發(fā)上毡泻,一...
    開(kāi)封第一講書(shū)人閱讀 52,158評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音粘优,去河邊找鬼牙捉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛敬飒,可吹牛的內(nèi)容都是我干的邪铲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼无拗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼带到!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起英染,我...
    開(kāi)封第一講書(shū)人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤揽惹,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后四康,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體搪搏,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年闪金,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疯溺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片论颅。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖囱嫩,靈堂內(nèi)的尸體忽然破棺而出恃疯,到底是詐尸還是另有隱情,我是刑警寧澤墨闲,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布今妄,位于F島的核電站,受9級(jí)特大地震影響鸳碧,放射性物質(zhì)發(fā)生泄漏盾鳞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一瞻离、第九天 我趴在偏房一處隱蔽的房頂上張望腾仅。 院中可真熱鬧,春花似錦琐脏、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至惰蜜,卻和暖如春昂拂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抛猖。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工格侯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人财著。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓联四,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親撑教。 傳聞我的和親對(duì)象是個(gè)殘疾皇子朝墩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容