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 ,则还会发生/不会发生其他事情
不要在班级的任何地方声明那里的财产。它已经在协议中声明。
不要放 @property MyView *myView;MyViewController.m 或 MyViewController.h 文件。
要修复有关“自动属性合成”的警告,您只需添加:
@synthesize myView = _myView;
Run Code Online (Sandbox Code Playgroud)
到MyViewController实现或根据需要添加显式 getter 和 setter 方法。
| 归档时间: |
|
| 查看次数: |
692 次 |
| 最近记录: |