我对自定义初始化方法中自动释放对象的原则感到有些困惑。例如:
- (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];
}
提前致谢。
答案 0 :(得分:3)
在Cocoa中,有这样的惯例:
alloc
或new
开头的方法会返回具有保留计数+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];
.....