属性和私人和扩展类组合界面的混淆
-
19-09-2019 - |
题
我已经下载了AA-plot图表的示例代码。
.H文件之一:
@interface MainViewController : UIViewController <APYahooDataPullerDelegate, CPPlotDataSource> {
CPLayerHostingView *layerHost;
@private
APYahooDataPuller *datapuller;
CPXYGraph *graph;
}
@property (nonatomic, retain) IBOutlet CPLayerHostingView *layerHost;
@end
在.m文件中,界面再次声明?
@interface MainViewController()
@property(nonatomic, retain) CPXYGraph *graph;
@property(nonatomic, retain) APYahooDataPuller *datapuller;
@end
我在示例项目的主视图控制器代码中找到了上述代码。
如果我执行以下操作, 上述代码和以下代码之间的区别是什么?
@interface MainViewController : UIViewController <APYahooDataPullerDelegate, CPPlotDataSource> {
CPLayerHostingView *layerHost;
APYahooDataPuller *datapuller;
CPXYGraph *graph;
}
@property (nonatomic, retain) IBOutlet CPLayerHostingView *layerHost;
@property(nonatomic, retain) CPXYGraph *graph;
@property(nonatomic, retain) APYahooDataPuller *datapuller;
@end
解决方案
您在.m文件中看到的“额外”内容是一个 类别. 。原始程序员可能只是想从他的班级的公共界面(在.H文件中)中隐藏他的一些实施细节,因此他做了一个类别(在这种情况下,无名 ()
)将它们添加到他的实现文件中。在这种特定情况下,他隐藏了私人变量的访问者,以使外部代码无法掌握。
您在第二个代码段中显示的更改将所有内容都放入单个类界面中。这些更改根本不应影响运行时操作。 (除了取出 @private
, ,是故意的吗?)语义差异是类别方法在运行时添加到类中。
类别只能添加方法,而不是实例变量,这就是为什么原始代码在原始代码中具有所有实例变量声明(即使是具有“秘密”登录器的人) @interface
堵塞。
不隶属于 StackOverflow