2009-09-14 25 views
5

Mam mały test narzędzia Foundation (Objective-C), że gram z i mam kilka pytań ...Dodawanie obiektów ciąg do NSMutableArray?

#import <Foundation/Foundation.h> 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    int planetLoop; 
    NSString *tempString; 
    NSMutableArray *planetArray = [[NSMutableArray alloc] init]; 

    NSLog(@"STRING ARRAY ... Start"); 
    for(planetLoop=0; planetLoop<10; planetLoop++) { 
     tempString = [NSString stringWithFormat: @"Planet_%03d", planetLoop+1]; 
     NSLog(@"Planet_%03d", planetLoop+1); 
     [planetArray addObject:tempString]; 
    } 

    [planetArray release]; 
    [pool drain]; 
    return 0; 
} 

Po pierwsze, zazwyczaj mam zwolnić obiektu po dodaniu go do tablicy, ale Czy mam rację, sądząc, że to, co mam obecnie, jest słuszne, ponieważ "tempString" jest dosłownym ciągiem znaków i jako taki nie musi być przydzielany lub uwalniany?

Po drugie, po uruchomieniu tego (przed wykonaniem) otrzymuję następujący komunikat "nie można odczytać nieznanego polecenia obciążenia 0x80000022", jeśli jest to problem z moim kodem? od wyszukiwania w google wygląda na to, że może to być błąd w XCode 3.1.2, czy ktoś ma jakieś pomysły?

Wreszcie coś robię źle, chodzi o to, aby wypełnić tablicę z 10 znaków "Planet_001" aż do "Planet_010"

EDIT: Ah, widzę, to jest to z powodu "= [NSString" bit tj

// Autoreleased object 
tempString = [NSString stringWithFormat: @"Planet_%03d", planetLoop+1]; 
// String literal 
tempString = @"Planet_"; 

wielkie dzięki, bardzo cenione -gary-

Odpowiedz

5

tempString nie jest właściwie ciąg literału. @"Planet_%03d"to ciąg literału. tempString jest obiektem autoreleased, co oznacza, że ​​zostanie zwolniony po wyczerpaniu NSAutoreleasePool. Zasadniczo pamięć jest już zarządzana i nie musisz nic robić.

Zasada jest taka: Jeśli new, alloc, copy lub retain przedmiot, potem trzeba release go. W przeciwnym razie pamięć jest już zarządzana, prawdopodobnie przez autorelease.

Ponadto zapomniałeś zwolnić pool. Poza tym wygląda dobrze.

+1

On uwalnia pulę: [basen spustowy] –

+0

Dzięki chłopaki, widzę, co się dzieje teraz, mała edycja powyżej, aby wyjaśnić ... – fuzzygoat

+0

@ Chris masz rację. Nie zdawałem sobie sprawy, że 'drain' ma' release'. –

1

jeden możliwy powód „nie można odczytać nieznane obciążenia polecenia 0x80000022” błędem wydaje się, że już przeniesieni do Snow Leopard bez uaktualniania deweloperów narzędzia w tym samym czasie. Wygląda na to, że błąd mógł zostać spowodowany przez próbę użycia wersji 10.5 do XCode do kompilacji w środowisku 10.6. Zajrzę do tego jutro.

Xcode 3.2 jest już dostępne w wersji Snow Leopard (Mac OS X 10.6). Po zainstalowaniu systemu Snow Leopard, uaktualnij system do Xcode 3.2, instalując go oddzielnie od obrazu dysku Xcode Tools. Możesz zainstalować go na wcześniejszych wersjach Xcode lub przenieść je na bok przed instalacją.

PS: Kiedy dostałem "Nie można odczytać nieznane obciążenia polecenia 0x80000022" błąd z systemem OSX ja 10.6.1 z Xcode 3.1.2

okrzyki -gary-

+0

Jeśli narzędzia nie są zsynchronizowane z wersją OS używasz, ustalić, że w pierwszej kolejności. Jest to znana niestabilna konfiguracja. – NSResponder

Powiązane problemy