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)
可能最简单和最"对象"的方法是在人身上创建一个创建所需人物的类方法.就像[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