2011-08-26 58 views
1

在Cocoa/Objective C中,靜態類方法是否線程安全?我正在定義一個類來進行相關的自定義URL請求,我想從多個不同的線程調用。比方說,我有一個類:可可/目標C:方法和線程安全

@interface URLConnector : NSObject { 
} 
+(Response *)getData:(NSString *)category; 
+(Response *)put:(NSString *)category content:(NSData *)content; 
@end 

每種方法定義NSMutableURLRequest,調用它,並使用NSRunLoop:runUntilDate:等待響應。他們還創建另一個類的實例,URLConnectorDelegate處理來自NSMutableRequests的回調,並在返回之前釋放它們。 (注:此代碼是基於使URL請求一個流行的公共圖書館)

我喜歡這種方法,它使所有的線程簡單,把所有的定製服務器相關的代碼在一個地方。線程可以通過一個函數調用來執行URL請求。

我的所有線程一次使用這些靜態功能,同時通話(即是靜態的Objective-C的方法,本質上就是線程安全的)?

回答

2

如果你知道你將要在後臺線程爲什麼不直接使用+[NSURLConnection sendSynchronousRequest:returningResponse:error:],並用它做什麼?

沒有需要運行循環的模糊。如果你只使用局部變量和參數,你幾乎沒有任何工作可以獲得線程安全。

否則,線程安全性取決於您獨立於方法類型。

類方法沒有任何一點線索比實例方法是安全的。事實上,這兩種方法在運行時間都是一樣的。該類實際上是它的元類的對象實例,因此對類方法的調用是對對象的常規方法調用。

+0

因此,就他們的局部變量而言,這兩種方法都是線程安全的嗎?例如,如果我在方法中迭代本地變量 - for(int i = 0; i <20; i ++) - 如果兩個線程同時運行該方法,這會導致衝突嗎? – Colin

+1

@Colin:堆棧中的任何本地變量都是線程本地的,因此是安全的。所以只要你不使用標記爲「靜態」的變量,或者以任何其他方式保持超出方法範圍,你就是安全的。 – PeyloW

0

我看不出有什麼辦法可以做到在類方法中的所有處理而不使用可以從不同的線程踐踏實例變量。我認爲你需要使這些方法成爲普通的實例方法併爲每個線程分配一個實例。我不確定你爲什麼會考慮首先制定他們的課程方法。

+0

我應該包括每次他們被調用時,靜態方法創建一個新的連接委託對象來處理響應。我將編輯原文。 – Colin

3

作爲一個類方法對線程安全沒有任何影響。重要的是你如何訪問數據。如果您以非線程安全的方式訪問數據,則該方法不是線程安全的。

不如抽自己的運行循環相反,我只是附加NSURLConnection和主運行循環,網址加載系統就像它的設計自我管理。見NSURLConnection scheduleInRunLoop:forMode:

+0

我編輯了一個更多關於爲什麼我想要使用這種方法的信息,但我明白你的觀點。我已經在線上研究了這個主題,並且有人通過這種方式成功地運行了自己的運行循環,但可能會遇到與NSURLConnection本身相關的問題。 – Colin

0

假設你正在呼籲NSRunLoop:runUntilDate:當前線程的運行循環(即無論哪個線程調用你的類方法),如果有這些類中的方法進行修改沒有全局/靜態變量,我相信他們應該是線程安全的。