0

当我在协议中定义属性时,我无法摆脱编译器警告。奇怪的是我定义了两个属性,而我只收到第二个属性的警告(它是对象类型,而第一个属性是值类型)。

这是屏幕截图:

编译器警告

谁能告诉我如何摆脱这个警告,为什么会产生它?代码工作正常,只是这个警告让我很恼火:)

4

2 回答 2

2

在您的程序中,该属性称为view. 必须有一个调用的 getterview和一个调用的 setter setView。如果你不使用@synthesize你必须提供这两个方法,这就是编译器警告的原因。代码工作正常,因为您没有使用点表示法引用属性或调用 getter 和 setter 方法。

于 2012-07-03T14:47:51.980 回答
0

您的问题是编译器找不到您在协议中定义的属性的实现。

出于这个原因,不建议将属性添加到协议中,相反,您只需定义一个简单的方法来访问该属性,然后再定义一个方法来设置它。这将为您提供正确的错误消息,并且虽然您不能使用点表示法,但它会将警告保留在正确的位置。

或者,您可以执行以下操作(不推荐,但出于教育原因):

#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 回答