使用NSArray初始化对象数组

时间:2013-02-20 00:48:27

标签: ios objective-c arrays nsarray

我对Objective-C和iOS很新,所以我一直在玩Picker View。我已经定义了一个Person Class,这样当你创建一个新的Person时,它会自动给那个人一个名字和年龄。

#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

现在我想制作一个人数组,这样我就可以把一大堆扔进选择器,挑选一个人并显示他们的年龄。首先,虽然我需要制作一个人数组。如何创建对象数组,初始化和分配它们?

5 个答案:

答案 0 :(得分:70)

还有一个简写:

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

相当于

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

正如iiFreeman所说,如果你不使用ARC,你仍然需要做适当的内存管理。

答案 1 :(得分:39)

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 :(得分:9)

没有人评论randomAge方法?

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

NSInteger是一种原始类型 - 很可能是intlong的类型。 在randomAge方法中,您可以计算大约1到98之间的数字。

然后您可以将该号码转换为 NSNumber 。你必须添加一个演员,因为编译器给你一个你不明白的警告。这让警告消失了,但是给你留下了一个可怕的错误:这个数字被强制成一个指针,所以现在你有一个指向前100个字节内存中某个整数的指针。

如果通过指针访问NSInteger,程序将崩溃。如果你通过指针写,你的程序将崩溃。如果将它放入数组或字典中,程序将崩溃。

将其更改为NSIntegerint,这可能是最好的,如果由于某种原因需要对象,则更改为NSNumber。然后通过调用 [NSNumber numberWithInteger:99] 或您想要的任何数字来创建对象。

答案 3 :(得分:0)

这可能无法真正回答问题,但是以防万一有人需要快速发送字符串值到需要NSArray参数的函数。

NSArray *data = @[@"The String Value"];

如果您需要发送的不仅仅是一个字符串值,还可以使用

NSArray *data = @[@"The String Value", @"Second String", @"Third etc"];

然后您可以将其发送到如下功能

theFunction(data);

答案 4 :(得分:-1)

这样你就可以创建NSArray,NSMutableArray。

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

NSArray objects =[NSArray arrayWithObjects:@"value1",@"value2",@"value3",nil];