为什么我必须声明标头中的协议指定的属性,而不是类扩展(实现)

A O*_*A O 5 protocols objective-c declared-property

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

@protocol MyProtocol <NSObject>
@property MyView *myView;
@end
Run Code Online (Sandbox Code Playgroud)

以及符合它的对象:

@interface MyViewController : NSViewController <MyProtocol>
@end
Run Code Online (Sandbox Code Playgroud)

但是,如果我在实现文件(类扩展)中声明属性(在协议中指定):

@interface MyViewController()
@property MyView *myView;
@end
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

在类扩展"MyViewController"中非法重新声明属性(属性必须为'readwrite',而其主要必须为'readonly')

似乎有两个主要的SO线程解决这个问题:
属性必须是readwrite,而它的主要必须是只读的
,
不能声明另一个窗口

第一个答案没有解释任何事情

第二个答案说你可以通过声明标题内的属性来绕过这个错误; 唉

头

@interface MyViewController : NSViewController <MyProtocol>
@property MyView *myView;
@end
Run Code Online (Sandbox Code Playgroud)

履行

@interface MyViewController()
@end
Run Code Online (Sandbox Code Playgroud)

这构建没有错误.

我也知道,当你声明一个@property协议的内部时,它不会自动合成.

因此,如果我想将@property声明保留在实现中,我将不得不这样@synthesize做.这也有效.


所以我的问题是,为什么声明@property标题内部与实现文件有关,如果@property最初在协议内声明?

没有协议,我认为唯一的区别是@property公共或私人.但显然,如果@property在头文件和实现文件中声明a ,则还会发生/不会发生其他事情

rma*_*ddy 6

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

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

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

@synthesize myView = _myView;
Run Code Online (Sandbox Code Playgroud)

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