這取決於如何使用框架。記住框架結構在平臺上已經存在很長時間了,這一點很重要。
對於一個系統框架,比如Apple創建的系統框架,你會很高興他們將框架放在一個已知的位置。在這些情況下,他們使用的路徑對於操作系統是固定的,並且它保證您不會意外地加載錯誤的路徑。此外,如框架文檔中所述,無論使用多少次,這些框架僅在機器上加載一次(請參見Apple:What Are Frameworks)。這樣做的好處是性能,在許多情況下,代碼和資源都是這樣。
由於最近移動到隨機化框架位置,蘋果在發佈說明中指出「Mountain Lion在系統引導時隨機重新定位內核,kexts和系統框架」,但它肯定顯示它們仍在共享這些資源,因此仍然從這個好處中獲益。
對於嵌入式框架來說,情況要複雜得多,而且蘋果公司多年來一直在通過各種方法,以便更容易地在任何可能的地方找到框架。由於共享本質,對於具有共同庫需求的應用程序來說,在效率方面共享這些需求並確保它們在共享數據時處於相同版本是合理的。因此,例如,如果您有兩個使用相同框架處理共享數據的獨立應用程序,則可以將共享框架放在/Library/Frameworks
中,並讓兩個應用程序明確查找該應用程序,以確保其他一些(可能較舊)版本的不會使用已被另一個App加載的框架。
最後,框架生產者和消費者在當前的工作方式上有很大的靈活性。這意味着開發人員可以決定共享一個框架,包含一個框架的私人副本,甚至可以同時執行這兩個框架,具體取決於該框架是否存在於機器上。然而,這種靈活性的代價是我們今天的複雜性。
您可能不想使用@rpath
的另一個原因是特別針對緊密鏈接的嵌入式框架(是的,人們將框架嵌入其他框架中)。在這些情況下,您不知道第一個框架的加載位置,但是您希望將嵌入式框架放入其中,以便它們保持在一起。在這種情況下,@loader_path
與正在加載它的代碼相關,以便您的插件框架可以正確地找到其資源。
回答關於某人將動態庫安裝名稱 設置爲「隨機」位置的具體示例。在這種情況下,你必須知道那個位置。有人做這件事可能有很多原因,比如想阻止其他程序的重用,或者因爲框架中有大量資源只能安裝在已知的共享位置。
感謝您的詳細解釋。後續問題,我將分開發布。 – hba