编写一个抽象类自定义初始化方法

时间:2012-09-13 17:31:04

标签: objective-c methods initialization abstract-class class-method

在抽象类中,自定义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方法,因为它工作正常,但我只是对此感到好奇。

3 个答案:

答案 0 :(得分:3)

您无需覆盖new。根据文档,new ...

  

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

因此,您只需覆盖init即可执行初始化。然后,您可以通过alloc/initnew自由创建实例,具体取决于您的口味。

答案 1 :(得分:2)

+ (id)new
{
    return [[self alloc] init;
}

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

除非您不需要编写,因为NSObject中已经实现了新功能。

答案 2 :(得分: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"];

请注意,这是一种类方法。