0

プロトコル内でプロパティを定義すると、コンパイラの警告を取り除くことができません。奇妙なことに、2 つのプロパティが定義されていて、2 番目のプロパティ (オブジェクト型で、最初のプロパティは値型) に対してのみ警告が表示されます。

スクリーンショットは次のとおりです。

コンパイラの警告

この警告を取り除く方法と、それが生成される理由を誰か教えてもらえますか? コードは正常に動作しています。私を悩ませているのはこの警告だけです:)

4

2 に答える 2

2

あなたのプログラムでは、プロパティは と呼ばれviewます。と呼ばれるゲッターとviewと呼ばれるセッターが必要setViewです。使用しない場合は@synthesize、これら 2 つのメソッドを提供する必要があり、これがコンパイラの警告の理由です。ドット表記を使用してプロパティを参照したり、getter および setter メソッドを呼び出したりしていないため、コードは正常に動作しています。

于 2012-07-03T14:47:51.980 に答える
0

問題は、コンパイラがプロトコルで定義したプロパティの実装を見つけられないことです。

このため、プロトコルにプロパティを追加することはお勧めしません。代わりに、プロパティにアクセスするための単純なメソッドと、それを設定するためのメソッドを 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);
    }
}
于 2012-07-03T14:56:56.713 に答える