Objective c 编写抽象类自定义初始值设定项方法
在抽象类中,自定义init方法如下所示:Objective c 编写抽象类自定义初始值设定项方法,objective-c,methods,initialization,abstract-class,class-method,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]overClass*object=[[Class alloc]init]。在我的抽象类中,这样一个方
- (id)init
{
self = [super init];
if (self)
{
//do some initialisations
}
return self;
}
在处理抽象类时,这将非常好:根本没有问题。但是,在创建对象时,我更喜欢Class*object=[Class new]
overClass*object=[[Class alloc]init]代码>。在我的抽象类中,这样一个方法的问题是它不起作用:
+ (id)new
{
id object = [super new];
if (object)
{
//do some initialisations
}
return object;
}
当尝试访问对象的属性时,Xcode将出现错误,表示在类型为“\u strong id”的对象上找不到相应的属性。我猜这是因为编译器不知道我的对象有什么属性,因为它刚刚创建
有没有办法绕过这个限制?如果没有,我将只使用init方法,因为它工作得很好,但我只是对此感到好奇。您不需要重写new
。根据文档,new
分配接收类的新实例,并向其发送init
消息,并返回初始化的对象
因此,您只能重写init
来执行初始化。然后,您可以通过alloc/init
或new
自由创建实例,具体取决于您的喜好。您不需要覆盖new
。根据文档,new
+ (id)new
{
return [[self alloc] init;
}
分配接收类的新实例,并向其发送init
消息,并返回初始化的对象
因此,您只能重写init
来执行初始化。然后,您可以根据自己的喜好,通过alloc/init
或new
自由创建实例
+ (id)new
{
return [[self alloc] init;
}
注意+
而不是-
,因为这是一个类方法
除非您不需要编写,因为NSObject中已经实现了new
注意+
而不是-
,因为这是一个类方法
除非您不需要编写,因为NSObject中已经实现了new。我不建议您使用的模式。创建自定义factory方法初始值设定项方法更具语义:
- (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"];
请注意,这是一个类方法。我不会建议您使用的模式。创建自定义factory方法初始值设定项方法更具语义:
- (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"];
请注意,这是一个类方法。哎呀,我真的知道;)现在编辑。哎呀,我真的知道;)现在编辑它。多么愚蠢的评论。当然,更多的语义意味着有意义,尤其是与new
相比。别想太多。查一下语义学的定义…“意义的研究”你不喜欢我的模式有什么?我知道像您的initWithName:
方法这样的自定义初始值设定项,但我真的不知道您的模式与我的模式有什么不同。你的代码应该读起来像句子。多么愚蠢的评论。当然,更多的语义意味着有意义,尤其是与new
相比。别想太多。查一下语义学的定义…“意义的研究”你不喜欢我的模式有什么?我知道像您的initWithName:
方法这样的自定义初始值设定项,但我真的不知道您的模式与我的模式有什么不同。你的代码应该像句子一样读。