objective-c-从另一个构造函数调用一个构造函数

objective-c-从另一个构造函数调用一个构造函数,objective-c,Objective C,假设您有以下两个构造函数: - (id)initWithTitle:(NSString *)title; - (id)initWithTitle:(NSString *)title page:(NSString *)page; 第二个构造函数与第一个构造函数没有什么不同,只是它设置了成员变量“page” 既然它基本上必须做同样的事情,那么有没有一种方法可以从第二个方法调用第一个方法来减少代码重复,或者您必须设置第三个方法来执行常见任务 我说的是类似的事情,尽管我怀疑这会起作用: - (id)i

假设您有以下两个构造函数:

- (id)initWithTitle:(NSString *)title;
- (id)initWithTitle:(NSString *)title page:(NSString *)page;
第二个构造函数与第一个构造函数没有什么不同,只是它设置了成员变量“page”

既然它基本上必须做同样的事情,那么有没有一种方法可以从第二个方法调用第一个方法来减少代码重复,或者您必须设置第三个方法来执行常见任务

我说的是类似的事情,尽管我怀疑这会起作用:

- (id)initWithTitle:(NSString *)_title {
    if(self = [super init]) {
        self.title = _title;
    }

    return self;
}

- (id)initWithTitle:(NSString *)_title page:(NSString *)_page {
     if(self = [self initWithTitle:_title]) {
         self.page = _page;
     }

     return self;
}

你说的很奇怪因为我在想这个

- (id)initWithTitle:(NSString *)_title {
    return [self initWithTitle:_title page:nil];
}

- (id)initWithTitle:(NSString *)_title page:(NSString *)_page {
    if(self = [super init]) {
        self.title = _title;
        self.page = _page;
    }
    return self;
}

它不工作吗?

首先,您没有构造函数,您有两个初始值设定项:

- (id)initWithTitle:(NSString *)title;
- (id)initWithTitle:(NSString *)title page:(NSString *)page;
与大多数初始值设定项一样,目标是设置一些实例变量(而不是成员变量)

第一步是识别指定的初始值设定项。在您的情况下,可能是:

- (id)initWithTitle:(NSString *)title page:(NSString *)page;
这意味着
-(id)initWithTitle:(NSString*)title将按照其他人的描述实施:

- (id)initWithTitle:(NSString *)_title {
    return [self initWithTitle:_title page:nil];
}
然而,我建议不要使用这种模式,因为它使子类化比它应该的更容易出错。在子类化中,必须始终重写指定的初始值设定项,或者必须实现一个调用指定初始值设定项的新初始值设定项。显然,初始值设定项越多,子类化中可能引入的bug就越多

此外,这:

Foo *f = [[Foo alloc] initWithTitle: @"Foo!" page: nil];
比这要清楚得多:

Foo *f = [[Foo alloc] initWithTitle: @"Foo!"];
第一个非常明确地表示您已经考虑过
page
,并决定显式地将其设置为
nil
,或者依赖类
Foo
来合理地设置页面。第二条没有这样的指示


子类化和明确的意图指示都是Cocoa缺乏这种方便方法的主要原因(有一些,但大多数都很旧——比政策真正成为规则时更旧)。

@phunehehehe有一个更好的解决方案,但你发布的内容会起作用。嗯,我想会的,现在我想起来了。感谢您更快地删除C++术语,并开始使用Objto-C术语,文档开始变得更有意义。Objective-C没有构造函数或成员变量。它有初始值设定项和实例变量。当您创建一个引入新初始值设定项的类别并且只想调用现有初始值设定项时,您无法避免这种模式。