Objective-C协议属性编译器警告

时间:2012-07-03 11:39:41

标签: objective-c protocols

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

这是截图:

compiler warning http://i47.tinypic.com/wrc0lk.jpg

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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);
    }
}