我有这些小代码:
Person *person1 = [[Person alloc] init];
person1.name = @"Meier";
[personArray addObject:person1];
[person1 release];
当我创建对象时,将其添加到数组并发送 release person1 仅由数组保留。该阵列成为所有者并负责 person1 。 但是当我使用 new 创建 person1 时,它会被添加到自动释放池中,我不应该向它发送发布。
如何让数组对此人负责?只有阵列?!
修改
我想我今天晚上很困惑。
是,使用 new 创建的对象不会自动添加到autoreleasepool。
是的,我知道我仍然需要发布用 new 创建的对象。
我暂时忘了这一切。非常感谢你的答案!
答案 0 :(得分:3)
首先[Person new]
是[[Person alloc] init]
的简写,而不是[Person person]
(根据惯例,它应该返回一个自动释放的实例)。
[Foo new]; //-> retained (you're among the owners)
[[Foo alloc] init]; //-> retained (you're among the owners)
[[Foo alloc] initWithBar:@"bar"]; //-> retained (you're among the owners)
[[[Foo alloc] init] autorelease]; //-> retained, then autoreleased (you're not among the owners)
[Foo foo]; //-> autoreleased (you're not among the owners)
[Foo fooWithBar:@"bar"]; //-> autoreleased (you're not among the owners)
据说你的代码完全按照你的意愿去做。
一旦数组被释放,它将调用[person1 release],然后调用[self dealloc],因为它的保留计数达到0. (如果你想知道为什么出于某种神奇的原因你的在步骤“4”之后,person1的retainCount不是1:read this)
这些代码段在功能上基本相同:
//Alloc, init, assign name, then release:
Person *person1 = [Person new];
person1.name = @"Meier";
[personArray addObject:person1];
[person1 release];
//Alloc, init, assign name, then release:
Person *person1 = [[Person alloc] init];
person1.name = @"Meier";
[personArray addObject:person1];
[person1 release];
//Alloc, init with argument name, then release:
Person *person1 = [[Person alloc] initWithName:@"Meier"];
[personArray addObject:person1];
[person1 release];
//Alloc, init with argument, assign name, then autorelease:
Person *person1 = [[[Person alloc] init] autorelease];
person1.name = @"Meier";
[personArray addObject:person1];
//Alloc, init with argument name, then autorelease:
Person *person1 = [[[Person alloc] initWithName:@"Meier"] autorelease];
[personArray addObject:person1];
//Use autoreleased convenience method:
Person *person1 = [Person person];
person1.name = @"Meier";
[personArray addObject:person1];
//Use autoreleased convenience method with argument name and add its result to array right away and anonymously:
[personArray addObject:[Person personWithName:@"Meier"]];
所有这些都导致person1仅由数组和NSAutoreleasePool(如果存在,后者应该是后四个片段的情况)拥有,并且只有在池被耗尽之后才会拥有。
答案 1 :(得分:2)
但是当我用new创建person1时 它被添加到自动释放池中 我不应该发给它。
根据the rules,上述内容不正确。如果使用new
创建Person,则仍然负责释放生成的对象。
然而,让我们假设为了论证,你不知何故创建了一个自动释放的Person实例。在这种情况下,您只是不释放该对象。如果将它添加到数组中,则数组将像往常一样保留对象,并在完成该对象时负责释放它。