2013-02-20 138 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用正确答案击败我时,我已经半途而废了。但是,我发现nameArr中的第一个名字很棒:D – Bergasms 2013-02-20 00:54:29

回答

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启用的环境中,如果你要使用它,而不ARC不要忘记加上自动释放对象进入阵列!

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

对于第二个例子,创建可变数组并创建一个副本,创建N个新人阵列会更高效,更直接。 – 2013-02-20 01:04:46

+1

使用'[复制人员]'而不是'arrayWithArray:'IMO更好。 (哦,我看到上面的评论是一样的...对不起) – borrrden 2013-02-20 01:27:46

66

也有这样做的简写:

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

这相当于

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

正如iiFreeman说,你还是需要的,如果你不是做正确的内存管理使用ARC。

+0

我试过这个,但我不断收到person1,2,3等“未声明的标识符”错误等 – 2013-02-20 19:59:30

+1

对象person1,2和3是否在任何地方声明? – 2013-02-20 22:40:33

9

没有人评论randomAge方法?

这是非常错误的,它不可能是任何人。

NSInteger是一种原始类型 - 它很可能是int型或long型的typedef。 在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];