我认为这与ARC无关。不同之处可能在于使用 ARC 时,编译器会对此给出警告/错误。
一般来说,在类方法中(那些以 + 而不是 - 开头并且被称为不同的方法) self 并不引用特定的对象。它指的是类。使用 [self alloc] 您可以创建该类的对象,无论它是否被子类化。如果这是一个实例方法 [[self class] alloc] 将非常等效。但是您有充分的理由使用类方法。
在这种情况下,为什么不直接返回结果?
+ (id)itemWithTitle:(NSString *)title target:(id)target action:(SEL)action
{
return [[self alloc] initWithTitle:title target:target action:action];
}
如果您的班级名称是 Foo 那么您可以选择:
+ (id)itemWithTitle:(NSString *)title target:(id)target action:(SEL)action
{
Foo *newMe = [[self alloc] initWithTitle:title target:target action:action];
// Here you have access to all properties and methods of Foo unless newMe is nil.
return newMe;
}
或更一般地说,无需访问 Foo 的方法和属性:
+ (id)itemWithTitle:(NSString *)title target:(id)target action:(SEL)action
{
id newMe = [[self alloc] initWithTitle:title target:target action:action];
return newMe;
}