-1

私は Cocoa アプリケーションを作成しており、さまざまなコード生成に Xcode を使用しています。UIView をサブクラス化するための .h および .m ファイルを生成する場合は問題なく動作しますが、UIViewController をサブクラス化する@interfaceと、両方のファイルで同じ宣言が得られます( )

//in MyViewController.h
@interface MyViewController : NSViewController <MyViewDelegate>

@end

だけでなく、

//in MyViewController.m
@interface MyViewController ()

@end

@implementation MyViewController

@end

それでも問題なくコンパイルされます。したがって、これが正常な動作であると仮定すると、質問の 2 つの部分は次のとおりです。(A) なぜこれが起こるのか、(B) 結果はどうなるか (特にコンパイル順序に関して)。

ありがとう!

4

2 に答える 2

2

UIViewController をサブクラス化すると、.m ファイルにあることを除いて、両方のファイルで同じ @interface 宣言を取得します ( )

お気づきのように、2 つのインターフェイス ブロックは同一ではありません()。これは重要です。が付いている()ものはクラス拡張であり、名前のないカテゴリに似ています。カテゴリとクラス拡張の 2 つの重要な違いは次のとおりです。

  1. クラス拡張ではインスタンス変数を宣言できますが、カテゴリではできません。

  2. クラス拡張は、実装ブロックと同じファイルに表示される必要があります。

クラス拡張機能は、ヘッダー ファイルで公開したくないインスタンス変数やメソッド (実装に固有であり、クラスのユーザーが依存するべきではないメソッドや変数など) を宣言する場合に便利です。

于 2014-04-11T21:26:17.860 に答える
0

カテゴリーをご存知ですか?観察しているものは似ていますが、カテゴリとは重要な違いがあります。ここでの違いは、それが匿名であり (したがって空の括弧)、元のクラスがコンパイルされると同時にコンパイルされることです。この後の部分は重要な部分です。つまり、インスタンス プロパティ (ストレージ) を追加できるということです。これは、「内部のみ」または「プライベート」のメソッドとプロパティを宣言するために最も一般的に使用されます。ただし、実行時に「プライベート」強制の概念がないことに注意してください。それは、公開したインターフェースと公開していないインターフェースがすべてです。これは、コア クラスの実装ファイルを作成した人にのみ「公開」される、非常に明確に定義されたインターフェイスを持つための 1 つの方法にすぎません。

于 2014-04-11T21:29:17.233 に答える