2014-04-30 61 views
4

如果我們包含任何外部庫或框架,我們在Xcode的項目設置的其他鏈接器標誌中包含「-ObjC」,任何人都可以告訴我它是什麼原因以及它做了什麼如果我們包括它。在Xcode中包含「-ObjC」的原因

在此先感謝..

+0

-ObjC是一個鏈接器標誌,用於編譯以本地代碼編寫的源文件,例如C++ – user2071152

+0

-ObjC加載實現Objective-C類或類別的靜態歸檔庫的所有成員。 – Shruti

回答

3

它在Apple's QA1490解釋得很好。

密鑰摘錄:

目的-C不爲每個功能定義(或 方法,在Objective-C)連接基的符號 - 相反,接頭符號僅產生 爲每個類。

...

要解決此問題,鏈接到的靜態庫 目標必須通過-ObjC選項鍊接。該標誌將導致接頭 加載每個對象文件中,定義一個Objective-C 類或類別

1

類別是最知名的用例這個標誌(如蘋果公司的QA1490解釋),但它們不是爲什麼需要這個標誌的唯一原因。

由於Objective-C是一種動態語言,它使NSClassFromString()等事情成爲可能,所以只包含實際使用的符號的C鏈接器的標準行爲(並丟棄所有其他符號)不起作用,因爲無法找出是否某些符號實際上以間接方式使用,如連接字符串,然後調用NSSelectorFromStringNSClassFromString

例如,考慮xib/nib文件:它們不參與鏈接階段,但它們可以實例化除了這個nib文件之外不被任何東西引用的庫類。如果鏈接器將這些類丟棄爲未使用,則筆尖無法加載並正常工作。

確保沒有任何東西丟失的唯一方法是在鏈接時從庫中包含每個Obj-C類,並且此標誌可以實現這一點。