我有一块来自Github的源代码块。它看起来像:
标头文件
@interface VTDUpcomingDisplayData : NSObject
@property (nonatomic, readonly, copy,) NSArray* sections; // array of VTDUpcomingDisplaySection
+ (instancetype)upcomingDisplayDataWithSections:(NSArray *)sections;
@end
实施文件
#import "VTDUpcomingDisplayData.h"
@interface VTDUpcomingDisplayData()
@property (nonatomic, copy) NSArray* sections;
@end
@implementation VTDUpcomingDisplayData
+ (instancetype)upcomingDisplayDataWithSections:(NSArray *)sections
{
VTDUpcomingDisplayData* data = [[VTDUpcomingDisplayData alloc] init];
data.sections = sections;
return data;
}
此块代码有两个名为“sections”的变量名称,但已成功构建。我有两个问题:
答案 0 :(得分:2)
Objective-C
中的正常情况,称为覆盖属性属性或重新声明属性。您可以在界面中声明属性为readonly
,并使其成为readwrite
(无需明确指定readwrite
属性,但在这种情况下您最好编写它)在实施中。
Here's Apple有关在类扩展中重新声明属性的文档
类扩展通常用于扩展公共接口 在...内使用的其他私有方法或属性 类本身的实现。例如,这是常见的 在接口中将属性定义为只读,但在a中作为readwrite 在实现上面声明了类扩展,以便 类的内部方法可以直接更改属性值。
首先,我不明白为什么会发生这种情况?
仅仅因为它在Objective-C中的正常行为
其次,如何在源代码中调用我想要的变量?
它只是一次属性,您可以在内部方法中以readwrite
的形式访问它。但在其他课程中,它仍然是readonly
答案 1 :(得分:0)
两个声明都引用相同的属性(和底层实例变量)。
但是,标题和实现中的属性声明不同。在标头中,该标头定义了此对象的调用者要使用的接口,该属性被声明为readonly
。在类的实现中,相同的属性缺少readonly
属性,即它是可读/写的。
这是为了允许对属性执行类读写访问,但是限制类的用户只读取属性。每个人都在访问相同的属性(实例变量),唯一的区别是不同调用者的访问权限。