所以我有一个协议,它需要声明一个属性:
@protocol MyProtocol <NSObject>
@property MyView *myView;
@end
以及符合它的对象:
@interface MyViewController : NSViewController <MyProtocol>
@end
但是,如果我在实现文件(类扩展名)中声明属性(在协议中指定):
@interface MyViewController()
@property MyView *myView;
@end
我收到此错误:
在类扩展“MyViewController”中非法重新声明属性(属性必须是“readwrite”,而其主要属性必须是“readonly”)
似乎有两个主要的 SO 线程解决了这个问题:
属性必须是读写的,而它的主线程必须是只读的
,并且
不能声明另一个窗口
第一个答案没有解释任何事情
第二个答案说,您实际上可以通过在标头内声明属性来规避此错误;唉
标题
@interface MyViewController : NSViewController <MyProtocol>
@property MyView *myView;
@end
执行
@interface MyViewController()
@end
这构建没有错误。
我也知道,当您声明@property
协议内部时,它不会自动合成。
因此,如果我想将@property
声明保留在实现中,我将不得不这样@synthesize
做。这也有效。
所以我的问题是,如果最初在协议内部声明,为什么声明@property
头文件内部与实现文件很重要?@property
如果没有协议,我认为唯一的区别是@property
公开或私有。@property
但显然,如果您在标头与实现文件中声明 a ,还会发生/不发生其他事情