关于对象所有权的小问题

时间:2011-04-05 18:53:52

标签: objective-c

我有这些小代码:

Person *person1 = [[Person alloc] init];
person1.name = @"Meier";
[personArray addObject:person1];
[person1 release];

当我创建对象时,将其添加到数组并发送 release person1 仅由数组保留。该阵列成为所有者并负责 person1 。 但是当我使用 new 创建 person1 时,它会被添加到自动释放池中,我不应该向它发送发布

如何让数组对此人负责?只有阵列?!

修改

我想我今天晚上很困惑。

是,使用 new 创建的对象不会自动添加到autoreleasepool。

是的,我知道我仍然需要发布用 new 创建的对象。

我暂时忘了这一切。非常感谢你的答案!

2 个答案:

答案 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)

据说你的代码完全按照你的意愿去做。

  1. 以自己为所有者创建本地实例person1。
  2. 将其添加到数组中(使该数组成为person1的第二个所有者)
  3. 释放person1(将自己从person1的所有者身上移除)
  4. 导致其唯一(当前)所有者为数组的Person实例。
  5. 一旦数组被释放,它将调用[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实例。在这种情况下,您只是不释放该对象。如果将它添加到数组中,则数组将像往常一样保留对象,并在完成该对象时负责释放它。