2010-04-07 20 views
8

C'è un modo per creare NSArray bidimensionale senza matrici di nidificazione nel formato primitivo aFloatArray [] [].Oggetto NSArray multidimensionale

Grazie.

+3

Che cosa è necessario eseguire? Forse potrebbero esserci altri approcci ancora più adatti al problema che stai risolvendo. – jlehr

risposta

17

Sfortunatamente no. Per creare un NSArray multidimensionale:

NSArray *multiArray = [NSArray arrayWithObjects: 
    [NSMutableArray array], 
    [NSMutableArray array], 
    [NSMutableArray array], 
    [NSMutableArray array], nil]; 

// Add a value 
[[multiArray objectAtIndex:1] addObject:@"foo"]; 

// get the value 
NSString *value = [[multiArray objectAtIndex:1] objectAtIndex:0]; 

Tuttavia, è possibile utilizzare il codice C in Objective-C (dal momento che è un rigoroso superset del C), se si adatta il vostro bisogno si potrebbe dichiarare la matrice come si doveva suggerito.

+6

Se non si utilizza la garbage collection, si perde ogni array all'interno di 'multiArray'. Per risolvere il problema, usa '[NSMutableArray array]'. –

+0

Davvero? Ho capito che [l'array NSMutableArray] ha restituito un NSMutableArray autoreleased, che a sua volta sarebbe stato mantenuto dal NSArray a cui è stato aggiunto! Lo cercherò sicuramente perché se hai ragione ho un sacco di codice da leggere lol – FatalMojo

+1

Sì. Il punto è che l'oggetto autoreleased _è_ mantenuto dall'array a cui è stato aggiunto. Quando viene rilasciato l'array principale, lo stesso vale per il suo contenuto. Se aggiungi '[NSMutableArray new]' a un array, il suo retain-count diventa '2'. Quando viene rilasciato l'array principale, ciascuno dei suoi figli ha ancora un conteggio di conservazione di '1'. –

10

Si può fare questo:

NSArray *array = @[@[@"0:0", @"0:1"], 
        @[@"1:0", @"1:1"]]; 

NSString *value = array[1][0]; 

Penso che questo sia molto più breve di roba "objectAtIndex".

ma attenzione si deve utilizzare la versione di Apple LLVM Compiler> = 4.0

+0

Questo è sicuramente l'approccio moderno. –

0

Per inserire un oggetto in Array multidimensionale nella Raccolta o TableView cellForRowAtIndexPath:

NSString *sectionRow = [NSString stringWithFormat:@"%d:%d", indexPath.section, indexPath.row];     
[dictionary setValue:[UIImage imageWithData:imageData] forKey:sectionRow]; 

per recuperare un oggetto dalla matrice multidimensionale in Collection o TableView cellForRowAtIndexPath:

NSString *sectionRow = [NSString stringWithFormat:@"%d:%d", indexPath.section, indexPath.row];  
UIImage *cellImage = [dictionary valueForKey:sectionRow];