2011-02-16 102 views
0

我想在Objective C中聲明一個二維數組作爲實例變量。我已經在頭部(數據)中獲得了NSMutableArray以及@property(nonatomic ,保留)。在viewDidLoad中:我有:Objective C二維數組內存問題

data = [[NSMutableArray alloc] init]; 
[data addObject:[[NSArray alloc] initWithObjects:@"Cheese", @"Meat", @"Veggie", nil]]; 
[data addObject:[[NSArray alloc] initWithObjects:@"Sandwich", @"Soup", @"Stew", nil]]; 

我的NSLog的方法中的陣列,它是正確的,但是當我嘗試從一個單獨的方法登錄它,我什麼也得不到(只是「@」),如果我嘗試訪問與

NSInteger num = [[data objectAtIndex:component] count]; 

它崩潰在日誌中沒有錯誤。我相信這是與不正確分配內存有關,但是我是Obj C的新手,並且在很多年裏都沒有使用過C風格的語言。 FWIW,我已經嘗試過很多變種,包括使用NSArray而不是mutable,[NSArray arrayWithObjects]而不是[[NSArray alloc] initWithObjects],以及它們之間的每個組合。

+0

忽略最後的評論,對不起。我假設你已經檢查和組件在數組的範圍內? – Dre 2011-02-17 03:31:27

回答

1

嘗試創建外陣列是這樣的:

self.data = [NSMutableArray arrayWithCapacity:2]; // assuming you're only adding 2 inner arrays. 
+0

您需要self.data才能正確保留陣列。 – jamihash 2011-02-17 03:16:22

1

以下可以是一個正確的方式。

self.data = [NSMutableArray array]; 
[data addObject:[NSArray arrayWithObjects:@"Cheese", @"Meat", @"Veggie", nil]; 
[data addObject:[NSArray arrayWithObjects:@"Sandwich", @"Soup", @"Stew", nil]; 

需要注意的是,如上面@jamihash評論,需要self.data妥善保留陣列。並且,您不需要allocNSArray您正在添加到data

0

作爲一個側面問題,您將保留子數組兩次。當你將它們添加到你的NSMutableArray中時,它們會被保留,所以你應該在創建時自動釋放它們,或者用一個返回一個自動釋放數組的NSArray方法來創建它們。

你的代碼本身不應該崩潰。你應該看看你何時何地釋放並保留NSMutableArray。你可以發佈更多的代碼,我相信有人會發現這個問題。