2009-08-12 7 views
0

短いバージョンでは、オプションのパラメータを持つプロトコルを使用しています。私が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つの質問:

  1. 警告を修正する正しい方法は何ですか?私は@dynamicを実装に追加しましたが、実際にはプロパティが実際には存在しないため、実際には正しくありません。
  2. なぜ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 

答えて

2

iPhone SDKはparicularバージョンのMac OS Xとまったく同じではありません。明らかにSnow Leopardのものと似ているSDK 3には、新しいバージョンのツールセットが含まれています。

+0

あなたが正しいと思います。警告を排除するための好ましい方法を知っていますか?それとも、SDK 2.xを使って「しないでください」というケースですか? –

+0

さて、警告しないでください。 SDK3の新機能です。 – Chuck

0

@ optionalはObjective-C 2.0で導入されたため、SDKの古いバージョンには適用されません。あなたの最善の策は、それが唯一のOBJC2の下でコンパイルする必要

#if __OBJC2__ 
@optional 
@property ... 
#endif 

とその周りの#ifdefのそれは(おそらく)存在しなければならないかどうかを判断するとしている、そしてそれは古いシステムとしてでは存在しませんプロトコルそのものの一部。

+2

私はiPhone SDKのすべてのバージョンが2007年後半にLeopardでリリースされたObjective-C 2.0をサポートしていると考えています。2008年半ばまでiPhone SDKがリリースされなかったことを思い出してください。 –

1

警告を削除する簡単な方法は、追加することです。

@dynamicフィールド;

あなたの実装に。コンパイラは、実装を動的に提供することをコンパイラに指示します。これは、オプションのプロパティであるため、あなたは気にしませんが、コンパイラをシャットダウンする必要があります。

関連する問題