是否允许在同一个类中复制变量名称?

时间:2016-10-03 04:19:01

标签: ios objective-c

我有一块来自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”的变量名称,但已成功构建。我有两个问题:

  • 首先,我不明白为什么允许这种情况发生?
  • 其次,如何在源代码中调用我想要的变量?

2 个答案:

答案 0 :(得分:2)

Objective-C中的正常情况,称为覆盖属性属性或重新声明属性。您可以在界面中声明属性为readonly,并使其成为readwrite(无需明确指定readwrite属性,但在这种情况下您最好编写它)在实施中。

Here's Apple有关在类扩展中重新声明属性的文档

  

类扩展通常用于扩展公共接口   在...内使用的其他私有方法或属性   类本身的实现。例如,这是常见的   在接口中将属性定义为只读,但在a中作为readwrite   在实现上面声明了类扩展,以便   类的内部方法可以直接更改属性值。

  • 首先,我不明白为什么会发生这种情况?

    仅仅因为它在Objective-C中的正常行为

  • 其次,如何在源代码中调用我想要的变量?

    它只是一次属性,您可以在内部方法中以readwrite的形式访问它。但在其他课程中,它仍然是readonly

答案 1 :(得分:0)

两个声明都引用相同的属性(和底层实例变量)。

但是,标题和实现中的属性声明不同。在标头中,该标头定义了此对象的调用者要使用的接口,该属性被声明为readonly。在类的实现中,相同的属性缺少readonly属性,即它是可读/写的。

这是为了允许对属性执行类读写访问,但是限制类的用户只读取属性。每个人都在访问相同的属性(实例变量),唯一的区别是不同调用者的访问权限。