41

我对 Objective-C 和 iOS 还很陌生,所以我一直在玩 Picker View。我已经定义了一个 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

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

4

5 回答 5

76

这样做还有一个简写:

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

相当于

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

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

于 2013-02-20T02:30:47.493 回答
48
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];
于 2013-02-20T00:53:33.110 回答
9

没人评论这个randomAge方法吗?

这是大错特错了,不能再错了。

NSInteger是一个原始类型 - 它很可能是 typedef 为intor long。在该randomAge方法中,您计算​​大约 1 到 98 之间的数字。

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

如果你NSInteger通过指针访问一个,你的程序就会崩溃。如果您通过指针写入,您的程序将崩溃。如果将其放入数组或字典中,您的程序将崩溃。

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

于 2014-02-13T17:26:46.807 回答
2

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

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

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

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

然后您可以将其发送到如下函数

theFunction(data);
于 2019-05-28T07:36:36.583 回答
-2

这样就可以创建NSArray、NSMutableArray。

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

NSArray objects =[NSArray arrayWithObjects:@"value1",@"value2",@"value3",nil];
于 2015-09-02T09:38:59.583 回答