2012-07-21 77 views
3

我想使用指向對象實例的指針數組,但只需要在需要時(即,懶惰地)創建這些對象的實例。該數組對應於UI中的表,因此每個數組索引對應於一個錶行。如何在objC中存儲一個nil指針數組?

我想使用NSMutableArray在創建對象實例時保留指針(當用戶在UI中選擇相應的行時發生)。

如果選中表中的一行,則會檢查相應的數組條目。如果指針值爲零,則該實例尚未創建,因此在該位置創建,並且該對象指針存儲在相應的索引數組條目中。

顯然,這需要我最初從一個nil指針數組開始,但objC不會讓我把一個nil指針放在NSArray中。

我不能僅僅在數組創建時向數組添加對象,因爲數組索引不對應於錶行。

這裏最好的objC解決方案是什麼?

回答

7

在目標C的慣用解決方案是使用NSNull

的NSNull類定義用於表示在收集對象(不允許零值)空值的單一對象。

創建NSMutableArray,並與[NSNull null]物體填滿它:

NSMutableArray *array = [NSMutableArray arrayWithCapacity:N]; 
for (int i = 0 ; i != 10 ; [a addObject:[NSNull null]], i++); 

當您在NSMutableArray檢查對象的存在與否,在索引的對象比較[NSNull null]:如果他們是一樣的,取而代之的是一個真實的物體;否則,真實的物體已經在那裏。

if ([array objectAtIndex:index] == [NSNull null]) { 
    MyRealObject realObject = [[MyRealObject alloc] init]; 
    [array replaceObjectAtIndex:index withObject:realObject]; 
} 

**編輯摘要**編輯使用循環初始化數組(謝謝bbum)。

+0

非常好,這是我正在尋找的解決方案,謝謝。 – Snips 2012-07-21 11:10:45

+0

不行; 「arrayWithObjects:count:」的第一個參數必須是指向對象的語言數組的'(id *)',並且'N'不能大於對象的數量。 – bbum 2012-07-21 18:14:09

+0

@bbum現在已修復,謝謝! – dasblinkenlight 2012-07-21 19:58:28

0
+0

+1和initWithCapacity:在分配可變數組時 – 2012-07-21 10:58:59

+3

感謝您的迴應。不幸的是,'arrayWithCapacity'爲這個* potential *容量保留了內存,當對象被添加(並且最初爲空)時,數組仍然是擴展的。此外,即使使用指定的容量,也不可能插入超出最初爲0的[數組數量]現有值的對象。而且,不可能插入nil的值。 – Snips 2012-07-21 11:06:32

3

NSMutableArray不支持稀疏數組。因此,您可以預先爲NSNull實例(或其他「無對象」標記)排列數組。例如:

a = [NSMutableArray array]; 
for(int i = 0; i<numberNeeded; i++) [a addObject:[NSNull null]]; 

或者,如果您的數組將會真正稀疏,請考慮使用某種映射來代替。 NSMutableDictionary會工作,但需要對象的鍵和所有拳擊/取消拳擊在某些情況下是痛苦的。或者,可以很容易地將CFDictionary配置爲使用整數鍵和對象值。

儘管字典顯然比較慢,但在大多數情況下,性能差異不太可能導致問題(但不是全部)。

相關問題