プロトコル内でプロパティを定義すると、コンパイラの警告を取り除くことができません。奇妙なことに、2 つのプロパティが定義されていて、2 番目のプロパティ (オブジェクト型で、最初のプロパティは値型) に対してのみ警告が表示されます。
スクリーンショットは次のとおりです。
この警告を取り除く方法と、それが生成される理由を誰か教えてもらえますか? コードは正常に動作しています。私を悩ませているのはこの警告だけです:)
プロトコル内でプロパティを定義すると、コンパイラの警告を取り除くことができません。奇妙なことに、2 つのプロパティが定義されていて、2 番目のプロパティ (オブジェクト型で、最初のプロパティは値型) に対してのみ警告が表示されます。
スクリーンショットは次のとおりです。
この警告を取り除く方法と、それが生成される理由を誰か教えてもらえますか? コードは正常に動作しています。私を悩ませているのはこの警告だけです:)
あなたのプログラムでは、プロパティは と呼ばれview
ます。と呼ばれるゲッターとview
と呼ばれるセッターが必要setView
です。使用しない場合は@synthesize
、これら 2 つのメソッドを提供する必要があり、これがコンパイラの警告の理由です。ドット表記を使用してプロパティを参照したり、getter および setter メソッドを呼び出したりしていないため、コードは正常に動作しています。
問題は、コンパイラがプロトコルで定義したプロパティの実装を見つけられないことです。
このため、プロトコルにプロパティを追加することはお勧めしません。代わりに、プロパティにアクセスするための単純なメソッドと、それを設定するためのメソッドを 1 つだけ定義します。これにより、適切なエラー メッセージが表示されます。ドット表記を使用することはできませんが、警告は適切な場所に表示されます。
または、次のようなこともできます (推奨されませんが、教育上の理由から):
#import <objc/runtime.h>
@protocol myProto
@property (assign) int myProperty;
@end
@implementation NSObject(myProto)
-(int) myProperty
{
return [objc_getAssociatedObject(self, "myProperty") intValue];
}
-(void) setMyProperty:(int) myProperty
{
objc_setAssociatedObject(self, "myProperty", [NSNumber numberWithInt:myProperty], OBJC_ASSOCIATION_RETAIN);
}
@end
@interface MyObj : NSObject<myProto>
@end
@implementation MyObj
@dynamic myProperty;
@end
int main(int argc, char *argv[])
{
@autoreleasepool
{
MyObj *myObj = [MyObj new];
myObj.myProperty = 10;
NSLog(@"%i", myObj.myProperty);
}
}