使用NSArray初始化对象数组

42

我对Objective-C和iOS还比较陌生,所以我一直在玩弄选择器视图。我已经定义了一个Person类,这样当您创建一个新的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

现在我想创建一个Person数组,这样我就可以将一些人放入选择器中,选择一个人并显示他们的年龄。不过我首先需要创建一个Person对象数组。如何创建、初始化和分配对象数组呢?

5个回答

79

还有一种简便的方法:

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

它相当于

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

正如iiFreeman所说,如果您没有使用ARC,仍然需要进行适当的内存管理。


我尝试了这个,但是在person1、person2、person3等上仍然出现了“未声明的标识符”错误。 - Howdy_McGee
1
对象person1、2和3在任何地方都声明了吗? - Allen Zeng

49
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];

3
第二个方法更高效和直接的做法是创建一个可变数组并对其进行复制,而不是创建N个新的人员数组。 - Hot Licks
1
使用[persons copy]比起arrayWithArray:更好,这是我的个人意见。 (哦,我看到上面的评论是一样的...抱歉) - borrrden

9

没有人评论randomAge方法吗?

这是非常错误的,再错误不过了。

NSInteger是一个原始类型 - 它很可能被typedef为intlong。在randomAge方法中,您计算了一个从1到98左右的数字。

然后,您可以将该数字转换为NSNumber。您必须添加一个强制类型转换,因为编译器给出了一个警告,您无法理解。这使得警告消失了,但留下了一个可怕的错误:该数字被强制成指针,因此现在您有一个指向内存前100个字节中某个整数的指针。

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

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


3

这可能并不完全回答问题,但以防万一有人只需要快速发送字符串值到需要一个NSArray参数的函数中。

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

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

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

那么您可以像下面这样将其发送给函数
theFunction(data);

-2

这样你就可以创建NSArray和NSMutableArray了。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接