2010-02-19 43 views
1

縱觀定義爲「初始化」:做+(無效)初始化做任何線程鎖定?

+ (void)initialize 

討論

運行時將只在上課前初始化每個類的節目只有一個時間,或從繼承的任何類它會從程序內發送第一條消息。 (因此,如果不使用類,則永遠不會調用該方法。)運行時以線程安全的方式將初始化消息發送給類。超類在它們的子類之前收到此消息。

聲明初始化是以「線程安全的方式」發送的。在封面之下,運行時是否創建了一個鎖,以使該調用線程安全,或者從運行時的工作方式來看,它本質上是線程安全的?如果它確實鎖定,那麼這是否意味着如果你實現了+初始化運行時創建了一個它不會創建的鎖?

回答

2

我無法回答它是否鎖定,但無論您是否實施+initialize,它仍被調用。默認的實現可能會做一些事情,但它仍然被調用。因此,如果運行時確實鎖定,則無論該方法是否由您的子類實現,都會創建鎖。

+0

正;並且創建鎖真的很便宜。鎖只在鎖定時變得昂貴!一旦類初始化完成,其中使用的同步機制不再被使用。順便說一下:Objective-c運行時的源代碼可用;它是開源的。 – bbum 2010-02-19 18:22:04

+0

一塊拼圖然後,謝謝。我可能需要獲取運行時間源,然後看看會發生什麼。 – 2010-02-19 18:30:24