7

所以我有一个协议,它需要声明一个属性:

@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 ,还会发生/不发生其他事情

4

1 回答 1

6

不要在班级的任何地方声明那里的财产。它已经在协议中声明。

不要放入@property MyView *myView;MyViewController.m 或 MyViewController.h 文件。

要修复有关“自动属性合成”的警告,您只需添加:

@synthesize myView = _myView;

MyViewController实现或根据需要添加显式 getter 和 setter 方法。

于 2015-09-28T15:44:43.740 回答