2010-04-07 15 views
8

Czy istnieje sposób na utworzenie dwuwymiarowego NSArray bez zagnieżdżania tablic w pierwotnym formacie aFloatArray [] [].Wielowymiarowy obiekt NSArray

Dziękuję.

+3

Co należy wykonać? Być może mogą istnieć inne podejścia, nawet lepiej dostosowane do problemu, który rozwiązujesz. – jlehr

Odpowiedz

17

Niestety nie. Aby stworzyć wielowymiarową NSArray:

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]; 

Jednakże, można użyć kod C w Objective-C (ponieważ jest to ścisłe nadzbiór C), czy pasuje do Twoich potrzeb można zadeklarować tablicę jak miałeś zasugerował.

+6

Jeśli nie używasz garbage collection, to przeciekasz każdą z tablic wewnątrz 'multiArray'. Aby to naprawić, użyj '[NSMutableArray array]'. –

+0

Naprawdę? Rozumiem, że [tablica NSMutableArray] zwróciła autoreleased NSMutableArray, która z kolei zostanie zachowana przez NSArray, do którego jest dodawany! Na pewno to sprawdzę, ponieważ jeśli masz rację, mam dużo kodu, aby przejść przez Lol – FatalMojo

+1

Tak. Chodzi o to, że autoreleased obiekt _is_ zachowany przez tablicę, do której został dodany. Po zwolnieniu macierzy nadrzędnej tak samo jej zawartość. Jeśli dodasz '[NSMutableArray new]' do tablicy, jego liczba zatrzymań stanie się '2'. Po zwolnieniu macierzy nadrzędnej, każde z jej potomków ma nadal wartość "1". –

10

Można to zrobić:

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

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

myślę, że to jest o wiele krótszy niż "objectAtIndex" rzeczy.

ale uwaga trzeba użyć wersji Jabłko LLVM Compiler> = 4,0

+0

To zdecydowanie nowoczesne podejście. –

0

Aby wstawić obiekt w tablicy wielowymiarowej w zbiorach lub Tableview cellForRowAtIndexPath:

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

aby pobrać obiekt z tablicy wielowymiarowej w kolekcji lub TableView cellForRowAtIndexPath:

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