当我在协议中定义属性时,我无法摆脱编译器警告。奇怪的是我定义了两个属性,我只得到第二个属性的警告(对象类型,而第一个属性是值类型)。
这是截图:
compiler warning http://i47.tinypic.com/wrc0lk.jpg
有谁能告诉我如何摆脱这个警告,以及为什么会产生这个警告?代码工作正常,只是这个警告让我烦恼:)
答案 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);
}
}