オプションのプロパティを持つプロトコル?
-
13-09-2019 - |
質問
簡単に言えば、オプションのパラメーターを持つプロトコルがあるということです。iPhone SDK 3.x を使用してこれを実装するクラスを構築すると、エラーや警告もなく、問題なくコンパイルされます。2.x SDK を使用すると、次の警告が表示されます。
Class.m:68: warning: property 'field' requires method '-field' to be defined - use @synthesize, @dynamic or provide a method implementation
どちらの場合でも問題なく機能します。
そこで 2 つの質問:
- 警告を修正する正しい方法は何ですか?追加した
@dynamic
プロパティが実際には存在しないため、実装は実際には正しくありません。 - SDK 3.x では動作するのに 2.x では動作しないのはなぜですか?ドキュメントには、「Mac OS X v10.5では、プロトコルにはオプションの宣言されたプロパティが含まれていない場合があります。」明らかに、それはまさにここではそうではありません。
ここでは、完全に明確ではない場合に、もう少しわかりやすくするために必要なコードの簡単なサンプルを示します。
@protocol MyProtocol
@required
- (void) method:(NSString*)param;
@optional
@property (nonatomic,retain) NSString* field;
@end
@interface MyClass : NSObject<MyProtocol> {
}
- (void) method:(NSString*)param;
@end
解決
iPhone SDK は、Mac OS X の特定のバージョンとまったく同じではありません。SDK 3 には明らかに、Snow Leopard のものに似た新しいバージョンのツールセットが含まれています。
他のヒント
警告を削除する簡単な方法は、次のように追加することです。
@動的フィールド;
あなたの実装に。これは、実装を動的に提供することをコンパイラに伝えますが、オプションのプロパティであるため動的に提供することはありませんが、コンパイラは停止するはずです。
@optional は Objective-C 2.0 で導入されたため、古いバージョンの SDK には適用できません。最善の策は、それが存在する必要があるかどうかを判断し(おそらく存在しない)、それから #ifdef を使用することです。
#if __OBJC2__
@optional
@property ...
#endif
その場合、OBJC2 の下でのみコンパイルされる必要があり、古いシステムにはプロトコル自体の一部として存在しません。
所属していません StackOverflow