2009-09-24 33 views
0

我有一個適用於Mac OS X的應用程序,它支持打算同時加載的插件。其中一些插件是在Cocoa框架的基礎上構建的,可以在一個插件中接收更新,而不是另一個。鑑於Objective-C當前的函數調度方法,任何插件對給定Objective-C例程的任何調用都將每次都進入相同的例程。這意味着插件A可以在插件B中找到自己的,並帶有一個簡單的Objective-C調用!顯然,我們正在尋找的是每個插件都與它自己的框架版本進行交互。 Ihavebeenreading一些對Objective-C和這種特殊的需求,但還沒有找到它最終的解決辦法呢。Objective-C函數調度衝突;或者,如何實現「命名空間」?

更新:上面我用的是「框架」的誤導性:該框架是一個靜態鏈接庫,內置到需要它的插件(一個或多個)。然而,Objective-C處理分派的方式,即使這些靜態鏈接的不同代碼碎片也會在Objective-C調度程序中混合,導致意想不到的後果。

更新2:我對answer provided here仍然有點模糊,因爲它似乎沒有像未經證實的假設那樣提出解決方案。

+0

請參閱HTTP提出的想法的衍生物://計算器。com/questions/178434/what-is-the-best-way-to-solve-an-objective-c-namespace-collision – 2009-09-25 00:02:48

回答

0

我不認爲我理解你對「插件A可以發現自己在插件B中」的評論。我猜你的意思是說,一旦你加載了一些依賴框架,那麼每個人都會使用它而不是加載它們,這是正確的。這是正確的,你是否有類似命名空間的東西。

這是一個是否需要插件的OpenSSL的一個版本,你會面臨同樣的問題,而另一個插件所需的OpenSSL的另一個版本。您不能加載兩個提供相同符號的庫。

我理解這個問題嗎?各種插件需要不同的,不兼容的相同框架版本?如果可能的話,我的方法是將框架更改爲靜態庫並將您的插件靜態鏈接到其框架。如果你沒有在插件之間共享框架,那麼框架確實不是你想要的。你只想編譯代碼(靜態鏈接)。整個框架的重點是分享。

+0

就是這樣 - 如果庫靜態鏈接,你也要烤麪包; Objective-C處理調度的方式*一切*由單個調度程序處理,因此兩個完全不同的,100%靜態鏈接的插件可能會發現自己無意中調用了彼此的例程。 – fbrereto 2009-09-24 23:48:51

1

你不能做到這一點(至少不平凡),Objective-C的目前還沒有命名空間的概念,並且運行時只提出一個單一的(全球)調度表。

注意,這不是唯一的Objective-C的,甚至是基於C的插件相當平凡相互之間也可以打電話,因爲一切都在同一個地址空間。不可否認,如果您擔心意外執行該操作的可能性較小,這是因爲兩級命名空間,但如果某個插件顯式地嘗試輸入另一個代碼,那麼這些命令將無法保護您。

如果你真的想隔離插件,你運行加載插件代碼,讓你的應用程序執行本身和輔助應用程序之間的RPC可以創建單獨的輔助程序。例如,這是Safari在Snow Leopard上以64位操作系統所做的工作。這種方法有許多好處,但實施起來相當複雜,你必須自己推出大部分。