2012-06-29 36 views
3

假設我想使用NS風格的C風格數組而不是使用NSArray。 這對NSArray的使用有任何性能損失嗎?在Objective-C中使用C風格的數組

+0

我不這麼認爲。對於大多數這種類型的東西都有免費的橋樑。 – onnoweb

+4

@onnoweb:在Core Foundation對象和Foundation對象之間使用「免費橋接」,該概念不適用於其他任何內容。 –

+0

啊,好點。 – onnoweb

回答

2

儘管沒有性能損失,但肯定會喪失靈活性:與NSMutableArray不同,您的C陣列是固定大小的。你也不能在C數組中使用快速枚舉,不得不求助於使用數組索引。

如果這些限制對您的要求沒問題,那麼C數組應該可以工作。它們也可以很好地與ARC搭配使用:一旦強引用的C數組超出了範圍,ARC會釋放所有未設置爲nil的實例。

+2

快速枚舉實際上會比索引到C數組慢,因爲快速枚舉需要消息分派(函數調用)的開銷。相對於舊的NSEnumerator模式,它被認爲是快速*。 –

+1

@JonathanGrynspan噢,我並不是想暗示枚舉通過索引會比快速枚舉慢,只是看起來好看的for:in構造不可用。我同意,索引的速度會更快,因爲在快速枚舉的實現中不會有任何複製。 – dasblinkenlight

3

沒有性能處罰,事實上技術上應該有性能改進。你交易的是很多NSArray的功能和合理數量的封裝,如果你不小心的話,給你一些語法頭痛和內存泄漏的風險。

也就是說,我所做的一個應用程序涉及到一個二維數組數組。該陣列方便地是一個固定的大小,事先已知。我把這個邏輯隱藏在NSArray的自定義模擬中,這個模擬採用了二維索引。早期的實現使用了一個以NSIndexPath爲關鍵字的字典。這很慢。我試過NSArrayNSArray s。這比較慢。我嘗試了一個2d C數組,而且速度更快。花了時間來平衡我的retain s和release s,沒有不良後果的表現。

+1

不幸的是,我發現很多Foundation類在嚴格循環和其他性能問題情況下使用時都很慢。一般的迴應是消息分派很慢,但是我在自己的代碼上運行的各種測試表明,消息分派幾乎不會增加任何使用常規C函數的開銷。不幸的是,在很多情況下,很多基礎課程似乎都很沉重。如果您可以承受失去許多更高級的功能,您可以創建和使用更加嚴格控制其內存和性能特徵的自定義類。 – Rabbit