2016-07-23 85 views
0

注意:我只在這裏談論.m文件。實例變量只在類內部可見

我對這兩件事情混爲一談,都被說成是順便宣佈內部實例變量:

方法1:

@interface MyClass() 
// Declare instance variable which is only visible in this class 
@end 

@implementation MyClass 
... 
@end 

方式2:

@implementation MyClass { 
    // Declare instance variable which is only visible in this class 
} 
... 
@end 

這兩種聲明實例變量的方式有什麼區別?

回答

0

在功能方面,沒有區別。例如,在類擴展中聲明ivars - @interface MyClass() {...ivars...}@end模式 - 確實可以將伊娃聲明移動到頭文件,然後其他類可以將其用於直接訪問以供內部使用。

0

在「@interface」行之後,您可以在大括號內添加實例變量。這是實例變量,而不是屬性。在花括號之後,或者在「@interface」行之後,如果沒有花括號,則可以添加方法和屬性。

因此,你的第一個評論是錯誤的。實例變量只能添加在大括號內。屬性生成實例變量(通常但不總是),但它們不是實例變量。

0

除了伊娃之外,如果需要,屬性也會生成setter和getter方法(根據您的屬性屬性)。但是,如果同步實現setter和getter,編譯器將不會合成ivar,因爲編譯器會假定您正在控制屬性實現,並且不會自動合成實例變量。

0

Objective C{ }這是您聲明實例變量的區域。您也可以在該部分使用訪問成員聲明,​​如@private @public & @protected。當你在{}之外聲明「ivars」時,變量將是一個文件範圍變量(靜態類型),它不會是你類的實例變量。

如果您使用屬性(@property),編譯器足夠智能,並且將使用其相應的setter和getter創建自己的ivars。

在實現文件中使用類擴展允許您添加僅可通過實現類擴展訪問的ivars或屬性(和方法)。它還允許您覆蓋基類的訪問,如屬性或私有方法。