我只是好奇这是正确的还是不好的做法? (即使用类方法来分配/初始化一个实例)?我也认为我必须在 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/

10-13 03:04