8

iOS6ベータ3を使っていて気づいた

UIViewContoller の新しいサブクラスを作成すると (私が気付いたこの動作を生成する他の親クラスはありません)、.m ファイルの上部に空のカテゴリが含まれるようになりました。過去にカテゴリについて学んでいたとき、一部の人々がこれと同じ手法を使用してプライベート メソッドを示していることに気付きました (ただし、完全にプライベートではありません)。

それがここにある意図ですか?物事を実際に非公開にすることに変更はありましたか? そこにも @private ディレクティブがあることに気付きました。

プライベート変数とメソッドに関するコーディング スタイルは何ですか?

更新: XCode はクラス拡張機能を使用するように私たちに勧めているので、私は先に進み、このプロジェクトのプライベート メソッド/ivar にそれらを使用しました。しかし、私は欠点を見つけました。サブクラス化された UIViewController の 1 つを、そのすべての UIButton、UILabels などと一緒に再利用できることがわかりました。UIViewController <- FirstViewController <- SecondViewController という継承がありました。

FirstViewController のクラス拡張に配置したすべてのプライベート メソッドは、SecondViewController でコードを記述したときにオートコンプリートに表示されません。ちょっとした迷惑……。

4

1 に答える 1

20

このインターフェース定義を参照しています:

@interface MYViewController ()
@end

これは技術的にはカテゴリではなくクラス拡張です。カテゴリには、括弧内に文字列があります。クラス拡張はコンパイル時にクラスに追加されるため、(通常はプロパティの形式で) ivar を追加できます。カテゴリは実行時に追加され、ivar を追加することはできません。

そうは言っても、あなたの主張は正しいです。これは、プライベート メソッドとプロパティを定義するために使用されます。

ObjC の世界では、「プライベート」は「立ち入り禁止」の標識であり、かみそりの壁ではありません。(コンパイラの強制を追加する) キーワードがありますが@private、これは ivar にのみ適用され、通常は必要ありません。このタイプの警告ベースのプライバシーは、ObjC で非常にうまく機能し、十分に機能します。

プライベート プロパティをこのクラス拡張に配置すると、外部の呼び出し元がそれらにアクセスしようとすると、「セレクターに応答しない可能性があります」という警告が表示されます (未定義のメソッドを呼び出した場合と同様)。ObjC プロジェクトに警告が存在することを許可しないでください。これにより、データのカプセル化が強制されます。


編集

それらが非公開の場合、サブクラスでポップアップするべきではありません。あなたが望むものは保護されています。ObjC には保護されたメソッドの優れたスキームはありませんが、一般的な手法は、MYViewController+Protected.h のような .h ファイル内のカテゴリにそれらを配置することです。優れた ObjC 設計の多くはサブクラス化されていないため、これが実際に発生することはめったにありません。代わりに合成と委任を使用します。

「なぜビューコントローラーだけなのか」について。まず、ビュー コントローラーだけではありません。これは、iOS の単なるビュー コントローラーです (まあ、VC、TableViewController、および GLKViewController)。Mac では、ウィンドウ コントローラーとスポットライト インポーターでもあります。覗く:

.../Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates
.../Library/Xcode/Templates

しかし、なぜそれらの?これらはすべてコントローラであり、コントローラがプライベート プロパティを必要とすることは非常に一般的です。実際、コントローラーにプライベート プロパティがない場合は、おそらく公開しすぎている可能性があります。これは、モデル クラスとビュー クラスの普遍的なものではありません。それが彼らの決定に影響を与えたと思います。また、テンプレートを所有していたのは別の人であったか、別の時期に更新された可能性もあります。時間の経過とともに滑らかになる小さな不一致が見られることがあります。

独自のテンプレートを作成することもできます。カスタム Xcode 4 ファイル テンプレートの作成を参照してください。

于 2012-07-27T00:30:39.237 に答える