迁移到ARC“无法在类方法中分配给self”

时间:2013-02-25 16:46:59

标签: objective-c automatic-ref-counting

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

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

    return self;
}

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

2 个答案:

答案 0 :(得分:6)

我认为这与ARC无关。不同的是,使用ARC时,编译器会为此提供警告/错误。

通常在类方法(以+而不是 - 以不同方式调用的方法)中,self不引用特定对象。它指的是班级。同 [自我分配] 无论是否为子类,都可以创建该类的对象。 如果这是一个实例方法[[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;
}

答案 1 :(得分:2)

您的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