自定义初始化方法中的自动释放

时间:2011-12-26 16:50:13

标签: objective-c

我对自定义初始化方法中自动释放对象的原则感到有些困惑。例如:

- (id)initWithId: (unsigned long)personID {
    self = [super init];
    if (self) {
        self.ID = personID;
    }

    return self;
}

根据objc编码惯例,我必须在返回时自动释放自己。但是那种代码一直在破碎。我错过了什么吗?我应该只自动释放我在这些方法中手动创建的那些对象,而不是“自我”,就像这样?

- (id)makeWithId: (unsigned long)personID {
    Person *obj = [[Person init] alloc];

    if (obj) {
        obj.ID = personID;
    }

    return [obj autorelease];
}

提前致谢。

2 个答案:

答案 0 :(得分:3)

在Cocoa中,有这样的惯例:

  • allocnew开头的方法会返回具有保留计数+1
  • 的对象
  • 创建对象的所有其他方法都返回一个自动释放的对象。

请注意,使用您在上面发布的init方法,不会创建对象。之前的alloc调用会创建对象。这只是设置它并使其可以使用。

至于你的makeWithId方法,你混淆了两个概念。像这样的工厂方法应该是一个类方法(即用+声明,而不是-)。然后你会像

一样使用它
Person *p = [Person makeWithId:3];

就目前而言,您返回的方法与方法调用的接收方不同。这意味着当你做

Person *p = [[Person alloc] makeWithId:3];

使用Person创建的alloc对象已泄露,p已自动释放。

因此,总而言之,从类'factory'方法返回自动释放的对象,而不在init方法中进行任何内存管理。

答案 1 :(得分:2)

你没有分配任何东西,所以你不必发布任何东西。

您可以在创建对象时自动释放对象。

YourClass *yourOblect = [YourClass alloc] initWithId:27] autorelease];
[yourObject doSomething];
.....