2016-10-03 88 views
0

我有一段從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; 
} 

此塊代碼有兩個叫 '節' 的變量名,但成功生成。我有兩個問題:

  • 首先,我不明白爲什麼會發生這種情況?
  • 二,如何在源代碼中調用我想要的變量?

回答

2

這在Objective-C中屬於正常現象,稱爲覆蓋屬性屬性或重新聲明屬性。您可以在界面中聲明一個屬性爲readonly,並使其爲readwrite(無需明確指定readwrite屬性,但在此情況下,您最好將其寫入)。

Here's關於類擴展重新聲明屬性

類擴展蘋果文檔經常被用來公共接口爲 實現的類本身的內部使用 額外的私有方法或屬性擴展。例如, 通常在接口中定義一個屬性爲只讀屬性,但在執行時聲明的類擴展名爲 ,以便該類的內部方法可以直接更改屬性值。

  • 首先,我不明白爲什麼這是不允許發生的?

    只是因爲它是在Objective-C

  • 第二正常行爲,如何調用準確我想在源代碼中的變量?

    它只是一次屬性,您可以在內部方法中以readwrite的身份訪問它。但在其他類中它仍然是readonly

0

這兩個聲明引用相同的屬性(和基礎實例變量)。

但是,在頭文件和實現中聲明的屬性不同。在定義該對象的調用者要使用的接口的頭部中,該屬性被聲明爲readonly。在該類的實現中,同一個屬性缺少readonly屬性,即它是可讀/寫的。

這是爲了允許類的讀寫訪問的實現,但限制類的用戶只能從屬性中讀取。每個人都訪問相同的屬性(實例變量),唯一的區別是不同調用者的訪問權限。

相關問題