在抽象类中,自定义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方法,因为它工作正常,但我只是对此感到好奇。
答案 0 :(得分:3)
您无需覆盖new
。根据文档,new
...
分配接收类的新实例,向它发送一个init 消息,并返回初始化对象。
因此,您只需覆盖init
即可执行初始化。然后,您可以通过alloc/init
或new
自由创建实例,具体取决于您的口味。
答案 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"];
请注意,这是一种类方法。