我只是好奇这是正确的还是不好的做法? (即使用类方法来分配/初始化一个实例)?我也认为我必须在 main() 中释放实例,因为它是我可以访问实例指针的唯一地方吗?
// IMPLEMENTATION
+(id) newData {
DataPoint *myNewData;
myNewData = [[DataPoint alloc] init];
return myNewData;
}
.
// MAIN
DataPoint *myData;
myData = [DataPoint newData];
... stuff
[myData release];
编辑:
也应该
myNewData = [[DataPoint alloc] init];
是(或没关系)
myNewData = [[self alloc] init];
编辑_002:
奇怪的是,当我添加自动释放时,我得到了......
编辑_003:
@Dave DeLong,最后一个问题,你说的最好是:
+(id) dataPoint {
return [[[self alloc] init] autorelease];
}
而不是(您将在主要发布的地方)
+(id) new {
return [[self alloc] init];
}
干杯加里
最佳答案
根据命名约定,您应该将其称为 +dataPoint
。分析器对您大吼大叫的原因是(按照惯例),使用“new”的类方法预计会返回一个保留计数为 +1 的对象。您正在返回一个具有 +0(自动释放)保留计数的对象,因此违反了约定。
正如@Peter 的回答中所提到的,要创建一个空对象,通常使用 [ClassName className]
方法来完成。例如: [NSArray array]
、 [NSData data]
、 [NSString string]
等。因此,您应该将其重命名为 [DataPoint dataPoint]
,然后将其实现为 return [[[self alloc] init] autorelease];
最好使用 [self alloc]
,因为它可以向下转换为子类。 IE,如果您创建一个 MutableDataPoint 子类,那么(如果您使用 [self alloc]
)执行 [MutableDataPoint dataPoint]
会返回一个 MutableDataPoint
,而如果您将其保留为 [DataPoint alloc]
,它将作为 DataPoint
对象返回(因为这就是您要分配的对象)。 (附带说明,self
指的是在方法的上下文中被操作的对象。对于实例方法,它是实例。对于类方法,它是 Class
对象本身)
编辑:
如果您确实希望类方法返回一个保留计数为 +1 的对象,那么(按照惯例),您只需将其称为 +new
(即 DataPoint * p = [DataPoint new];
)。然而,+new
方法的使用似乎或多或少地被废弃了,+alloc/-init...
或类便利方法是有利的选择。
编辑 #2(回复:Edit_003):
我个人更喜欢前者( +dataPoint
),但这只是因为 +new
不常见,而且我不必记得对对象进行 -release
。不过,任何一个都是完全可以接受和正确的。
关于objective-c - 从类方法分配对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1681684/