7

したがって、プロパティを宣言する必要があるプロトコルがあります。

@protocol MyProtocol <NSObject>
@property MyView *myView;
@end

およびそれに準拠するオブジェクト:

@interface MyViewController : NSViewController <MyProtocol>
@end

ただし、実装ファイル (クラス拡張) 内でプロパティ (プロトコルで指定) を宣言すると、次のようになります。

@interface MyViewController()
@property MyView *myView;
@end

次のエラーが表示されます。

クラス拡張 'MyViewController' のプロパティの再宣言が不正です (属性は 'readwrite' である必要があり、そのプライマリは 'readonly' である必要があります)

これに対処する 2 つの主要な SO スレッドがあるようです:
属性は読み取り書き込みである必要があり、そのプライマリは読み取り専用
である必要があり、
別のウィンドウを宣言できません

最初の答えは何も説明しません

2 番目の回答は、ヘッダー内でプロパティを宣言することにより、このエラーを実際に回避できることを示しています。そして悲しいかな

ヘッダ

@interface MyViewController : NSViewController <MyProtocol>
@property MyView *myView;
@end

実装

@interface MyViewController()
@end

これはエラーなしでビルドされます。

@propertyまた、プロトコルの内部を宣言しても、自動的に合成されないことも知っています。

@propertyしたがって、宣言を実装内に保持したい場合は、そうしなければなりませ@synthesizeん。そして、これも機能します。


だから私の質問は、最初にプロトコル内で宣言された@property場合、ヘッダーと実装ファイルの内部を宣言することが問題になるのはなぜですか?@property

@propertyプロトコルがなければ、唯一の違いはパブリックにするかプライベートにするかだと思いました。@propertyしかし、ヘッダーと実装ファイルでa を宣言すると、他のことが起こる/起こらないことが明らかにあります。

4

1 に答える 1

6

クラスのどこにもプロパティを宣言しないでください。プロトコルですでに宣言されています。

@property MyView *myView;MyViewController.m または MyViewController.h ファイルを入れないでください。

「自動プロパティ合成」に関する警告を修正するには、次を追加するだけです。

@synthesize myView = _myView;

実装に追加するか、MyViewController必要に応じて明示的な getter および setter メソッドを追加します。

于 2015-09-28T15:44:43.740 に答える