假設我想使用NS風格的C風格數組而不是使用NSArray。 這對NSArray的使用有任何性能損失嗎?在Objective-C中使用C風格的數組
回答
儘管沒有性能損失,但肯定會喪失靈活性:與NSMutableArray
不同,您的C陣列是固定大小的。你也不能在C數組中使用快速枚舉,不得不求助於使用數組索引。
如果這些限制對您的要求沒問題,那麼C數組應該可以工作。它們也可以很好地與ARC搭配使用:一旦強引用的C數組超出了範圍,ARC會釋放所有未設置爲nil
的實例。
快速枚舉實際上會比索引到C數組慢,因爲快速枚舉需要消息分派(函數調用)的開銷。相對於舊的NSEnumerator模式,它被認爲是快速*。 –
@JonathanGrynspan噢,我並不是想暗示枚舉通過索引會比快速枚舉慢,只是看起來好看的for:in構造不可用。我同意,索引的速度會更快,因爲在快速枚舉的實現中不會有任何複製。 – dasblinkenlight
沒有性能處罰,事實上技術上應該有性能改進。你交易的是很多NSArray
的功能和合理數量的封裝,如果你不小心的話,給你一些語法頭痛和內存泄漏的風險。
也就是說,我所做的一個應用程序涉及到一個二維數組數組。該陣列方便地是一個固定的大小,事先已知。我把這個邏輯隱藏在NSArray
的自定義模擬中,這個模擬採用了二維索引。早期的實現使用了一個以NSIndexPath
爲關鍵字的字典。這很慢。我試過NSArray
NSArray
s。這比較慢。我嘗試了一個2d C數組,而且速度更快。花了時間來平衡我的retain
s和release
s,沒有不良後果的表現。
不幸的是,我發現很多Foundation類在嚴格循環和其他性能問題情況下使用時都很慢。一般的迴應是消息分派很慢,但是我在自己的代碼上運行的各種測試表明,消息分派幾乎不會增加任何使用常規C函數的開銷。不幸的是,在很多情況下,很多基礎課程似乎都很沉重。如果您可以承受失去許多更高級的功能,您可以創建和使用更加嚴格控制其內存和性能特徵的自定義類。 – Rabbit
- 1. 在ObjectiveC中排序數組
- 2. 你如何在C風格的數組上使用find_if和reverse_iterator?
- 3. 空調風格數組在Objective-C
- 4. C風格的多維數組
- 5. C#PHP風格的數組鍵
- 6. 的肖像和風景中的ObjectiveC
- 7. Javascript數組在PHP風格
- 8. 從Objectivec中調用C main
- 9. 在C++風格的方法中更改現有數組?
- 10. 如何在ObjectiveC中聲明和使用3維數組?
- 11. 使用Ifstream將文本文件中的數字添加到C風格數組
- 12. 在Swift中使用C風格無符號字符數組和位運算符
- 13. C++風格的矢量 - 指針數組還是數組?
- 14. 在ObjectiveC代碼中使用C++類中的靜態字段
- 15. 風格類在c#
- 16. JavaScript中的關聯風格數組?
- 17. 如何在另一種風格的按鈕中使用風格?
- 18. 嚴格別名和std :: array與C風格的數組
- 19. 用Python編寫的C風格數據
- 20. 構造函數調用的C++風格
- 21. 在C++中使用C風格鑄造怪異行爲
- 22. 使用c#2008 winforms的tooltrip tablelayout風格
- 23. 使用iPhone中的C/C++靜態庫ObjectiveC Apps
- 24. 如何將C風格的數組發送到Objective-C方法
- 25. 是reinterpret_cast到C風格的數組非法C++ 11?
- 26. C++ int main(int argc,char * argv []) - 是一個c風格的數組?
- 27. C#中的解碼風格
- 28. C中的新風格#
- 29. C++風格的註釋風格
- 30. 在C/C++中聲明Unix風格
我不這麼認爲。對於大多數這種類型的東西都有免費的橋樑。 – onnoweb
@onnoweb:在Core Foundation對象和Foundation對象之間使用「免費橋接」,該概念不適用於其他任何內容。 –
啊,好點。 – onnoweb