1

興味をそそられたView Controllerを初期化する方法を見てきました。私の経験不足かもしれませんが、非常に便利だと思いますが、避けるべき理由があるかどうかを確認しようとしているので、採用する必要があるかどうかもわかります.

UIViewController* imageC = [UIViewController imageViewController];

カテゴリimageViewController内の静的メソッドは次のとおりです。

+(UIViewController*) imageViewController
{
    return [[UIViewController alloc] initWithNibName:@"ImageViewController" bundle:nil];
}

これは優れた信頼性の高い設計ですか?そう思いますが、確かではありません。静的メソッドであるということは、コンテキストが不足していることを意味しますが、この場合、それが問題になるかどうかはわかりません。このアプローチを使用すると、長期的にどのような問題が発生する可能性がありますか?(ある場合)

4

2 に答える 2

2

コードにはいくつかの問題があります。まず、Objective C には静的メソッドがありません。クラス メソッドがあり、インスタンス メソッドと同じように動的ディスパッチを行います。これにはクラスオブジェクトを使用するだけです。

UIViewControllerサブクラスで呼び出された場合でも、コードは常に のインスタンスを割り当てます。これは、Objective-C の予想される動作ではありません。は で定義された便利なコンストラクタ[NSMutableArray array]ですが、可変配列を返します。arrayNSArray

3 番目の問題はマイナーです。メソッドが return を宣言すると、サブクラスのユーザーにとって有益ですinstancetype。そうすれば、メソッドはレシーバー クラスのインスタンスを返し、コンパイラーは静的な型チェックを行うことができます。この概念は呼ばrelated return typeれ、clang で最近導入されたばかりです。

より良いバージョンは次のとおりです。

+ (instancetype)imageViewController
{
    return [[self alloc] initWithNibName:@"ImageViewController" bundle:nil];
}
于 2013-01-26T22:44:12.223 に答える
2
  UIViewController* imageC = [UIViewController imageViewController];

これは便利なコンストラクターまたはファクトリ メソッドとして知られており、完全に合法で便利です。ところで、これはクラス メソッドであり、静的メソッドではありません。

便利なコンストラクターには、次の 2 つの主な特徴があります。

  1. 標準の alloc/init でクラスをインスタンス化するためのより便利な構文を提供します。

  2. autorelease現在のスコープの最後または現在の自動解放プールの最後に割り当てが解除されるオブジェクトを返します。

ほとんどの Cocoa クラスには、+className... という形式で名前が付けられた一連のクラス メソッドがあることに、クラス ドキュメントで気付いていると思います。これらの特別なクラス メソッドは「簡易コンストラクタ」と呼ばれ、一時オブジェクトの作成に使用されます。 . 一時的とは、便利なコンストラクターによって返されたオブジェクトが自動解放されると想定されていることです [...]。

ソース

編集: 便利なコンストラクターのメカニズム (および一般的なリターン参照) の詳細については、Objective C ARC リファレンスのセクションを参照してください。3.2.2 .

于 2013-01-26T22:13:39.133 に答える