2012-12-08 99 views
0

我是新來的Objective-C & osx架構。我開始玩搭建框架然後使用它。我跟着這個偉大的tutorialobjective-c框架 - 動態庫安裝名稱

在本教程中,我必須設置該框架的目標的動態庫安裝名稱@rpath/MyFramework.framework/Versions/A/MyFramework.我的理解是,@rpath將擴大到裝載機(消費者)運行路徑搜索路徑

看起來加載框架的責任似乎被框架作者和消費者作者分開。有人能解釋爲什麼框架的作者需要關注消費者的運行路徑搜索路徑嗎?例如,如果框架作者將動態庫安裝名稱設置爲指向某個隨機目錄(而不是@rpath),客戶端將如何使用該框架?

在此先感謝。

回答

1

這取決於如何使用框架。記住框架結構在平臺上已經存在很長時間了,這一點很重要。

對於一個系統框架,比如Apple創建的系統框架,你會很高興他們將框架放在一個已知的位置。在這些情況下,他們使用的路徑對於操作系統是固定的,並且它保證您不會意外地加載錯誤的路徑。此外,如框架文檔中所述,無論使用多少次,這些框架僅在機器上加載一次(請參見Apple:What Are Frameworks)。這樣做的好處是性能,在許多情況下,代碼和資源都是這樣。

由於最近移動到隨機化框架位置,蘋果在發佈說明中指出「Mountain Lion在系統引導時隨機重新定位內核,kexts和系統框架」,但它肯定顯示它們仍在共享這些資源,因此仍然從這個好處中獲益。

對於嵌入式框架來說,情況要複雜得多,而且蘋果公司多年來一直在通過各種方法,以便更容易地在任何可能的地方找到框架。由於共享本質,對於具有共同庫需求的應用程序來說,在效率方面共享這些需求並確保它們在共享數據時處於相同版本是合理的。因此,例如,如果您有兩個使用相同框架處理共享數據的獨立應用程序,則可以將共享框架放在/Library/Frameworks中,並讓兩個應用程序明確查找該應用程序,以確保其他一些(可能較舊)版本的不會使用已被另一個App加載的框架。

最後,框架生產者和消費者在當前的工作方式上有很大的靈活性。這意味着開發人員可以決定共享一個框架,包含一個框架的私人副本,甚至可以同時執行這兩個框架,具體取決於該框架是否存在於機器上。然而,這種靈活性的代價是我們今天的複雜性。

您可能不想使用@rpath的另一個原因是特別針對緊密鏈接的嵌入式框架(是的,人們將框架嵌入其他框架中)。在這些情況下,您不知道第一個框架的加載位置,但是您希望將嵌入式框架放入其中,以便它們保持在一起。在這種情況下,@loader_path與正在加載它的代碼相關,以便您的插件框架可以正確地找到其資源。

回答關於某人將動態庫安裝名稱 設置爲「隨機」位置的具體示例。在這種情況下,你必須知道那個位置。有人做這件事可能有很多原因,比如想阻止其他程序的重用,或者因爲框架中有大量資源只能安裝在已知的共享位置。

+0

感謝您的詳細解釋。後續問題,我將分開發布。 – hba