当我在协议中定义属性时,我无法摆脱编译器警告。奇怪的是我定义了两个属性,而我只收到第二个属性的警告(它是对象类型,而第一个属性是值类型)。
这是屏幕截图:
谁能告诉我如何摆脱这个警告,为什么会产生它?代码工作正常,只是这个警告让我很恼火:)
当我在协议中定义属性时,我无法摆脱编译器警告。奇怪的是我定义了两个属性,而我只收到第二个属性的警告(它是对象类型,而第一个属性是值类型)。
这是屏幕截图:
谁能告诉我如何摆脱这个警告,为什么会产生它?代码工作正常,只是这个警告让我很恼火:)
在您的程序中,该属性称为view
. 必须有一个调用的 getterview
和一个调用的 setter setView
。如果你不使用@synthesize
你必须提供这两个方法,这就是编译器警告的原因。代码工作正常,因为您没有使用点表示法引用属性或调用 getter 和 setter 方法。
您的问题是编译器找不到您在协议中定义的属性的实现。
出于这个原因,不建议将属性添加到协议中,相反,您只需定义一个简单的方法来访问该属性,然后再定义一个方法来设置它。这将为您提供正确的错误消息,并且虽然您不能使用点表示法,但它会将警告保留在正确的位置。
或者,您可以执行以下操作(不推荐,但出于教育原因):
#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);
}
}