2013-02-20 19 views
30

Jestem całkiem nowy w Objective-C i iOS, więc bawiłam się widokiem Picker. Zdefiniowałem Osobistą Klasę, aby po utworzeniu nowej Osoby automatycznie nadawała tej osobie imię i wiek.Inicjalizuj tablicę obiektów za pomocą NSArray

#import "Person.h" 

@implementation Person 

@synthesize personName, age; 

-(id)init 
{ 
    self = [super init]; 
    if(self) 
    { 
     personName = [self randomName]; 
     age = [self randomAge]; 
    } 

    return self; 
} 

-(NSString *) randomName 
{ 
    NSString* name; 
    NSArray* nameArr = [NSArray arrayWithObjects: @"Jill Valentine", @"Peter Griffin", @"Meg Griffin", @"Jack Lolwut", 
          @"Mike Roflcoptor", @"Cindy Woods", @"Jessica Windmill", @"Alexander The Great", 
          @"Sarah Peterson", @"Scott Scottland", @"Geoff Fanta", @"Amanda Pope", @"Michael Meyers", 
          @"Richard Biggus", @"Montey Python", @"Mike Wut", @"Fake Person", @"Chair", 
          nil]; 
    NSUInteger randomIndex = arc4random() % [nameArr count]; 
    name = [nameArr objectAtIndex: randomIndex]; 
    return name; 
} 

-(NSInteger *) randomAge 
{ 
    //lowerBound + arc4random() % (upperBound - lowerBound); 
    NSInteger* num = (NSInteger*)(1 + arc4random() % (99 - 1)); 

    return num; 
} 

@end 

Teraz chcę zrobić tablicę Osób więc mogę wrzucić kilka do kompletacji, wybrać jedną osobę i pokazać ich wiek. Najpierw jednak muszę stworzyć szereg Osób. Jak utworzyć tablicę obiektów, zainicjować i przydzielić je?

+3

byłem w połowie odpowiadając gdy iiFreeman mnie uprzedził z poprawną odpowiedzią. Jednak znajduję imię w twoim imieniu Arr, aby być niesamowite: D – Bergasms

Odpowiedz

38
NSMutableArray *persons = [NSMutableArray array]; 
for (int i = 0; i < myPersonsCount; i++) { 
    [persons addObject:[[Person alloc] init]]; 
} 
NSArray *arrayOfPersons = [NSArray arrayWithArray:persons]; // if you want immutable array 

również można dotrzeć bez używania NSMutableArray:

NSArray *persons = [NSArray array]; 
for (int i = 0; i < myPersonsCount; i++) { 
    persons = [persons arrayByAddingObject:[[Person alloc] init]]; 
} 

Jeszcze jedno - to ważne dla ARC włączona środowiska, jeśli masz zamiar używać go bez ARC nie zapomnij dodać autoreleased przedmiotów do tablicy!

[persons addObject:[[[Person alloc] init] autorelease]; 
+2

Dla tego drugiego byłoby bardziej wydajne i prostsze, aby po prostu utworzyć zmienną tablicę i zrobić jej kopię, zamiast tworzyć tablice N nowych osób. –

+1

Lepszą formą jest użycie '[osoby copy]' zamiast 'arrayWithArray:' IMO. (Och, widzę, że powyższy komentarz jest taki sam ... przepraszam) – borrrden

66

Istnieje również skrótowa to zrobić:

NSArray *persons = @[person1, person2, person3]; 

To odpowiednik

NSArray *persons = [NSArray arrayWithObjects:person1, person2, person3, nil]; 

Jak powiedział iiFreeman, trzeba jeszcze zrobić odpowiednie zarządzanie pamięcią, jeśli nie jesteś używając ARC.

+0

Próbowałem tego, ale ciągle otrzymuję komunikat "niezadeklarowany identyfikator" na osobie1,2,3 itd. –

+1

Czy obiekty 1, 2 i 3 są zadeklarowane w dowolnym miejscu? –

9

Nikt nie komentuje metody randomAge?

To strasznie źle, to nie może być żaden wronger.

NSInteger jest typem pierwotnym - najprawdopodobniej jest typem int lub long. W metodzie randomAge oblicza się liczbę od około 1 do 98.

Następnie wyrzuć tę liczbę do numeru NSNumber *. Musisz dodać rzut, ponieważ kompilator dał ci ostrzeżenie, którego nie zrozumiałeś. To spowodowało, że ostrzeżenie zniknęło, ale zostawiło ci straszny błąd: Ta liczba została zmuszona do bycia wskaźnikiem, więc teraz masz wskaźnik do liczby całkowitej gdzieś w pierwszych 100 bajtach pamięci.

Jeśli uzyskasz dostęp do wskaźnika NSInteger za pomocą wskaźnika, program ulegnie awarii. Jeśli napiszesz wskaźnik, twój program się zawiesi. Jeśli umieścisz go w tablicy lub słowniku, program się zawiesi.

Zmień to na NSInteger lub int, co jest prawdopodobnie najlepsze, lub na NSNumber, jeśli potrzebujesz jakiegoś obiektu z jakiegoś powodu. Następnie utwórz obiekt, wywołując [NSNumber numberWithInteger: 99] lub dowolny numer, który chcesz.

-1

Jak utworzyć NSArray, NSMutableArray .... ??

NSArray keys =[NSArray arrayWithObjects:@"key1",@"key2",@"key3",nil]; 

NSArray objects =[NSArray arrayWithObjects:@"value1",@"value2",@"value3",nil]; 
Powiązane problemy