2013-06-21 52 views
0

在較早版本的框架中,有兩個類A和B,A是B的一個子類。在較新的版本B中不再存在,並且B(ivars等)中的所有內容都是現在位於A. 可執行文件與舊版本鏈接,因此它會查找_OBJC_IVAR _ $ _ B.ivar。不過,我需要它在新版本上工作(我不能重新編譯它)。那麼有沒有辦法改變_OBJC_IVAR _ $ _ A.ivar的引用?

回答

1

沒有辦法安全地做到這一點。該符號不僅需要解析,而且運行時可能會跳過該符號。符號別名可能工作,但它會很脆弱。

依賴舊版本框架直接引用ivar符號的可執行文件將需要類佈局兼容,並且包括具有那些ivars的子類。

當Objective-C「2.0」解決了脆弱的基類問題時,它沒有添加將ivars從類移動到類的能力(因爲A和B都可以具有相同名稱的ivar--完全有效,儘管可疑)。


如果你絕對必須走這條路,你可以嘗試在鏈接線走樣的象徵。找到合適的別名標誌添加到OTHER_LD_FLAGS在構建設置編輯:

-alias symbol_name alternate_symbol_name 
      Create an alias named alternate_symbol_name for the symbol symbol_name. By default the 
      alias symbol has global visibility. This option was previous the -idef:indir option. 
+0

我並不意味着移動伊娃,我的意思是改變可執行文件是指類(由於B已不存在) – user1000039

+1

沒有關係;它仍然是同樣的問題。在鏈接器中可能會有一種方法來標記符號(在developer.apple.com上搜索鏈接器文檔),但是在這條路徑的瘋狂之處在於它完全是一個不受支持的事情,很可能會中斷。 – bbum

+0

嗯,我可以在十六進制編輯器中更改它,假定A和B的名稱長度相同。我假設有一個值與我需要更改的字符串的長度有關 – user1000039