在Objective C中创建自定义对象数组

4 iphone model-view-controller objective-c

编辑 我想用代码实现的是创建一个包含20个唯一"Person"对象的数组.我现在知道了,感谢下面的那些人,我要打电话给dealloc.

for (int i = 0; i < 20; i++)
{
    Person *myPerson = [[Person alloc] init];
    myPerson.name = @"Brian";
    myPerson.age = [NSNumber numberWithInteger:23];     
    [myArray addObject:myPerson];       
    [myPerson dealloc];         
}
Run Code Online (Sandbox Code Playgroud)

在学习Objective C的过程中,为什么这段代码对你来说似乎很疯狂.但是我来自Java,所以我的逻辑对于Objective C来说还不是很好.

我试图用20个人物体填充我的阵列.但似乎我一直在添加相同的Object人.然后解除分配,这就失败了.

所以我的问题是:用20个不同的人物对象填充数组的正确方法是什么.每个人的名字和年龄在将来会有所不同,但是在我学习的时候,它们都是相同的.

是这样做的唯一方法是键入很多这样的代码:

    Person *myPerson1 = [[Person alloc] init];
    myPerson.name = @"Brian";
    myPerson.age = [NSNumber numberWithInteger:23];     
    [myArray addObject:myPerson1];  
    Person *myPerson2 = [[Person alloc] init];
    myPerson.name = @"Brian";
    myPerson.age = [NSNumber numberWithInteger:23];     
    [myArray addObject:myPerson2];  
    Person *myPerson3 = [[Person alloc] init];
    myPerson.name = @"Brian";
    myPerson.age = [NSNumber numberWithInteger:23];     
    [myArray addObject:myPerson3];  
Run Code Online (Sandbox Code Playgroud)

20次?还是有更优雅的解决方案?

谢谢你的建议.-码

DHa*_*ick 10

你的for循环代码是正确的,除了在循环结束时释放myPerson.您不希望取消分配它,因为该对象由数组保留.通常,您不希望直接调用dealloc,而是希望使用retain/release.有关内存管理的更多信息,请查看Apple的指南

所以你是正确的,除了dealloc被改为发布.

for (int i = 0; i < 20; i++)
{
    Person *myPerson = [[Person alloc] init];
    myPerson.name = @"Brian";
    myPerson.age = [NSNumber numberWithInteger:23];     
    [myArray addObject:myPerson];       
    [myPerson release];         
}
Run Code Online (Sandbox Code Playgroud)


Rob*_*sor 8

可能最简单和最"对象"的方法是在人身上创建一个创建所需人物的类方法.就像[NSString stringWithFormat],您将返回一个自动释放的对象,以便调用者甚至不需要释放它.

永远不要打电话给dealloc自己 - 信任release

- (Person*) personWithName:(NSString*)name andAge:(NSNumber*)age
{
     Person* p = [[Person alloc] init];
     p.name = name;
     p.age = age;
     [p autoRelease];
     return p;
}
Run Code Online (Sandbox Code Playgroud)

现在,您将能够在一行中将每个人添加到阵列中,而不会泄漏内存

[myArray addObject:[Person personWithName:@"Brian" andAge:23]];
[myArray addObject:[Person personWithName:@"Alice" andAge:4]];
[myArray addObject:[Person personWithName:@"Bob" andAge:60]];  
Run Code Online (Sandbox Code Playgroud)

进一步阅读:http://www.cocoadev.com/index.pl?AutoRelease