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

Objective c 为什么我必须在报头中声明协议指定的属性,而不是类扩展(实现),objective-c,protocols,declared-property,Objective C,Protocols,Declared Property,所以我有一个协议,它要求声明一个属性: @protocol MyProtocol <NSObject> @property MyView *myView; @end 我得到这个错误: 在类扩展中非法重新声明属性 “MyViewController”(属性必须为“readwrite”,而其主 必须为“只读”) 似乎有两个主SO线程解决了这个问题: 和 第一个答案不能解释任何事情 第二个答案是,实际上可以通过在头中声明属性来避免这个错误;唉 标题 @interface MyView

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

@protocol MyProtocol <NSObject>
@property MyView *myView;
@end
我得到这个错误:

在类扩展中非法重新声明属性 “MyViewController”(属性必须为“readwrite”,而其主 必须为“只读”)

似乎有两个主SO线程解决了这个问题:


第一个答案不能解释任何事情

第二个答案是,实际上可以通过在头中声明属性来避免这个错误;唉

标题

@interface MyViewController : NSViewController <MyProtocol>
@property MyView *myView;
@end
@interface MyViewController()
@end
这是一个没有错误的构建

我还知道,当您在协议中声明一个
@属性时,它不会自动被合成

因此,如果我想将
@属性
声明保留在实现内部,我必须对它进行
@合成。这也行得通


所以我的问题是,如果
@property
最初是在协议内部声明的,那么为什么在头文件内部声明
@property
与实现文件之间有什么关系呢


如果没有协议,我认为唯一的区别是将
@属性
设置为公共或私有。但是很明显,如果您在头文件中声明一个
@属性,与在实现文件中声明一个
属性相比,还有其他事情发生了/没有发生。它已经在协议中声明了

不要放置
@property MyView*MyView

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

@synthesize myView = _myView;

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

因为您公开声明类符合协议(在.h文件中),所以还必须公开声明您拥有该属性。如果你只想让财产私有,遵守类扩展上的协议,而不是公共接口。我仍然会遇到这样的错误:\n而且我也不认为我可以这样做,因为我的其他对象需要知道
MyViewController
符合
MyProtocol
——而且如果我遵守类扩展OK,似乎没有人知道它符合,那么如果您需要公开声明协议,那么为什么不公开声明属性呢?是的,我应该这样做,但我想我不明白为什么在头或实现中声明
@属性
很重要,为什么在协议中声明
@属性
读写
,但是由于实现中的
readonly
,它需要是公共的,因此必须在接口(头)中声明,而不是在实现中声明。因此,我假设在协议中声明属性为
readwrite
,在实现中声明属性为
readonly
,由于某种原因,编译器只是假设自动合成属性?在Xcode 7下,不能在类扩展中将属性声明为只读(或读写)。
@interface MyViewController()
@end
@synthesize myView = _myView;