2

我有一个类方法看起来像:

+ (id)itemWithTitle:(NSString *)title target:(id)target action:(SEL)action
{
    self = [[self alloc] initWithTitle:title target:target action:action];

    return self;
}

它与手动引用计数一起工作得很好,但是当我尝试将它与 ARC 一起使用时,我收到错误:“无法在类方法中分配给 self”。有没有办法解决这个问题?

4

2 回答 2

6

我认为这与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;
}
于 2013-02-25T16:51:17.267 回答
2

您的 pre-ARC 代码不应该滥用该self关键字。它应该看起来像这样。

+ (id)itemWithTitle:(NSString *)title target:(id)target action:(SEL)action
{
    MyClass* obj = [[[MyClass alloc] initWithTitle:title target:target action:action] autorelease];

    return obj;
}

在 ARC 中,唯一的区别是您可以删除autorelease.

于 2013-02-25T16:50:58.020 回答