1

在抽象类中,自定义的 init 方法如下所示:

- (id)init
{
    self = [super init];

    if (self)
    {
        //do some initialisations
    }

    return self;
}

这在使用抽象类时会非常好用:完全没有问题。但是,在创建对象时,我更Class *object = [Class new];喜欢Class *object = [[Class alloc]init];. 在我的抽象类中使用这种方法的问题在于这不起作用:

+ (id)new
{
    id object = [super new];

    if (object)
    {
        //do some initialisations
    }

    return object;
}

当试图访问对象的属性时,Xcode 会报错,说在 '__strong id' 类型的对象上找不到相应的属性。我猜那是因为编译器不知道我的对象有什么属性,因为它刚刚被创建。

有没有办法绕过这个限制?如果没有,我将只使用 init 方法,因为它工作得很好,但我只是对此感到好奇。

4

3 回答 3

3

您不需要覆盖new. 根据文件,new...

分配接收类的新实例,向其发送初始化消息,并返回初始化对象。

所以你只需要重写init来执行你的初始化。然后,您可以根据自己的喜好通过alloc/init或自由创建实例。new

于 2012-09-13T17:52:04.700 回答
2
+ (id)new
{
    return [[self alloc] init;
}

请注意,+而不是-因为这是一个类方法。

除非你不需要写,因为 new 已经在 NSObject 中实现了。

于 2012-09-13T17:54:33.143 回答
0

我不会建议您使用的模式。创建自定义工厂方法初始化方法更具语义:

- (id) init
{
   // init code
}

- (id) initWithName:(NSString *)name
{
   // init code
}

+ (id) personWithName:(NSString *)name
{
    // add autorelease on non-ARC
    return [[super alloc] initWithName:name];
}

Person *person = [Person personWithName:@"Steve Jobs"];

请注意,它是一个类方法。

于 2012-09-13T18:01:46.883 回答