Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 编写抽象类自定义初始值设定项方法_Objective C_Methods_Initialization_Abstract Class_Class Method - Fatal编程技术网

Objective c 编写抽象类自定义初始值设定项方法

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]。在我的抽象类中,这样一个方

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

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

    if (self)
    {
        //do some initialisations
    }

    return self;
}
在处理抽象类时,这将非常好:根本没有问题。但是,在创建对象时,我更喜欢
Class*object=[Class new]
over
Class*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:
方法这样的自定义初始值设定项,但我真的不知道您的模式与我的模式有什么不同。你的代码应该像句子一样读。