1

UIViewController のサブクラスに次のものがあります。

- (id) initWithFullScreen
{
    self = [super initWithNibName:nil bundle:nil];

    if (self) 
    {
        _fullScreen = YES;
    }

    return self;     
}
- (id) init
{
    self = [super initWithNibName:nil bundle:nil];

    if (self) 
    {
        _fullScreen = NO;
    }

    return self; 
}

- (id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{
    return [self init];
}

ご覧のとおり、指定された初期化子のスーパー クラスを呼び出す 2 つの初期化子があるため、推奨されているようにすべてがチェーン化されているわけではありません。これは大丈夫ですか?

4

3 に答える 3

2

代わりに、次のようにしてください。

- (id)initWithFullScreen:(BOOL)useFullScreen
{
  self = [super initWithNibName:nil bundle:nil];
  if(self) {
    _fullScreen = useFullScreen;
  }
  return self;
}

- (id)init
{
  return [self initWithFullScreen:NO];
}

- (id)initWithNibNameBlahBlahBlah...
{
  return [self init];
}
于 2012-05-14T05:26:27.033 に答える
2

はい、大丈夫です。

指定された初期化子は、Objective-C 言語の一部ではなく、単なる規則です。一般に、1 つの init メソッドを介してすべてをルーティングする場合、提供したい他のすべての便利な init メソッド間でコードが重複することを心配する必要はありません。

また、サブクラスを作成するときに、スーパークラスで呼び出す必要がある init メソッドもわかります。(実際には、3 番目の init メソッドinitWithNibName...はこの規則に違反しています。スーパークラスの指定されたイニシャライザを呼び出す代わりに、単に を呼び出していますinit。)

あなたの場合、メソッド署名でイニシャライザを宣言し、initWithFullScreen:(BOOL)fullScreenそれを指定されたイニシャライザに指定するのがおそらく道です。その中で、スーパークラスの指定された初期化子を呼び出すようにしてください。

次に、便利な初期化子を作成できます。必要initWithFullScreeninitWithoutFullScreen応じて; どちらも指定されたイニシャライザを呼び出すだけです。例えば:

- (id)initWithoutFullScreen
{
    return [self initWithFullScreen:NO];
}

したがって、慣習を破っても問題ありません。あなたの理由があるかもしれません。しかし、コードを整理しておくと、コードを整理しておく方が一般的には簡単です。

修正

追加のクレジットとして、クラスにメソッドが必要な NSCoding プロトコルを検討してくださいinitWithCoder:。NSCoding を採用し、そのスーパークラスも NSCoding を採用するクラスは、初期化への 2 つのパスinitWithCoder:(呼び出すメソッドと[super initWithCoder:coder]通常の指定された初期化子) を持つように準備する必要があるため、ルールに違反していると言う人もいるかもしれません。

于 2012-05-14T05:43:41.183 に答える
1

methodsではなく、それらを考えてくださいinitializers。そうです、あなたは好きなだけ持つことができmethodsます。
また、本当に必要でない限りnibNameOrNil、and nibBundleOrNilin initWithFullScreenandを利用するようにしてください。 また、簡単にするために、このようなメソッドを持つことができますinit

- (id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil fullScreen:(BOOL)useFullScreen
{
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])
      {
         _fullScreen = useFullScreen;
      }
    return self;
}
于 2012-05-14T05:35:11.050 に答える