2013-02-20 4 views
30

Я довольно новичок в Objective-C и iOS, поэтому я играл с Picker View. Я определил класс Person, чтобы при создании нового Person он автоматически дал этому человеку имя и возраст.Инициализировать массив объектов с помощью 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 

Теперь я хочу, чтобы сделать массив людей, так что я могу бросить кучу в селекторе, выбрать одного человека, и показать их возраст. Сначала, хотя мне нужно создать массив Лиц. Как создать массив объектов, инициализировать и распределить их?

+3

Я был на полпути, отвечая, когда iiFreeman избил меня с правильным ответом. Тем не менее, я нахожу первое имя в вашем имениArr, чтобы быть потрясающим: D – Bergasms

ответ

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 

также вы можете достичь этого без использования NSMutableArray:

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

Еще одна вещь - это действительно для АРК включен среды, если вы собираетесь использовать его без ARC не забудьте добавить autoreleased объекты в массив!

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

Для этого второго было бы более эффективным и более прямолинейным, чтобы просто создать изменяемый массив и сделать его копию, а также создать N новых персональных массивов. –

+1

Лучше использовать '[person copy]' вместо 'arrayWithArray:' IMO. (О, я вижу, что вышеприведенный комментарий такой же ... извините) – borrrden

66

Существует также сокращенная сделать это:

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

Это эквивалентно

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

Как сказал iiFreeman, вам все еще нужно сделать надлежащее управление памятью, если вы не используя ARC.

+0

Я пробовал это, но я продолжаю получать ошибку «необъявленного идентификатора» на лице1,2,3 и т. Д. –

+1

Являются ли объекты person1, 2 и 3 объявленными в любом месте? –

9

Никто не комментирует метод randomAge?

Это так ужасно неправильно, что это не могло быть ничтожным.

NSInteger - это примитивный тип - это, скорее всего, typedef'd как int или long. В методе randomAge вы вычисляете число от 1 до 98.

Затем вы передаете это число NSNumber *. Вы должны были добавить бросок, потому что компилятор дал вам предупреждение, которое вы не поняли. Это заставило предупреждение уйти, но оставило вас с ужасной ошибкой: этот номер был вынужден быть указателем, поэтому теперь у вас есть указатель на целое число где-то в первых 100 байтах памяти.

Если вы получаете доступ к NSInteger через указатель, ваша программа выйдет из строя. Если вы напишете указатель, ваша программа выйдет из строя. Если вы поместите его в массив или словарь, ваша программа выйдет из строя.

Измените его либо на NSInteger, либо на int, что, вероятно, является лучшим, или NSNumber, если вам по какой-то причине нужен объект. Затем создайте объект, вызвав [NSNumber numberWithInteger: 99] или любой номер, который вы хотите.

-1

Как создать NSArray, NSMutableArray .... ??

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

NSArray objects =[NSArray arrayWithObjects:@"value1",@"value2",@"value3",nil]; 
Смежные вопросы