[英]IOS objective-C instance vars — what's the difference
在方法之外,在接口部分與實現部分中聲明變量之間有什么區別?
您是說在實現中的ivar塊中,例如
@implementation MyClass {
id someIvar;
}
// methods go here
@end
如果是這樣,那么唯一的區別就是對其他代碼的可見性。 在運行時,該ivar與@interface
部分中聲明的ivar不能區分。 但是,該類之外的代碼可以看到在@interfaces
聲明的ivars,除非這些ivars用@protected
或@private
標記, @protected
其他類可以進入並纏繞這些ivars。 但是@implementation中聲明的@implementation
甚至對於外部代碼也不可見,因此它們無法觸及ivars。
在大多數情況下,這只是代碼清潔度問題。 除非是公開的,否則頭文件中不應包含任何內容。 那為什么要把艾瓦斯放在那里呢?
正如Josh Caswell指出的那樣,以這種方式聲明的ivars需要使用最新版本的Clang。
您問題的另一種解釋是您有類似的代碼
@implementation MyClass
- (void)someMethod { /* ... */ }
NSString *var;
- (void)otherMethod { /* ... */ }
@end
如果這是您的意思,那么答案是,不要這樣做。 在此代碼段中,我們聲明了一個名為var
的全局變量,而不是實例變量。 @implementation
塊中變量的位置無關緊要,它與C中的全局變量完全相同(因為就是這樣)。
@interface
聲明的變量是實例變量。 在較新的編譯器中,實例變量也可以在@implementation
中的塊中聲明,類似於在@interface
進行聲明的方法-這會影響其可見性,但不會影響其生存期 。
在實現中聲明為“方法外”的變量,如:
@implementation
static int CallCount = 0;
是最接近的Objective-C有一類變量-一個變量,它的類的所有實例共享,而不是實例變量,每個對象實例都有其自己的變量。
此類變量具有執行生命周期-它存在於整個應用程序的單個執行中-就像其他語言中的典型類變量一樣。 (實例變量的生存期是它們所屬的對象實例的生存期。)
static
的使用進一步將變量名的可見性(而不是生存期)限制為僅包含聲明的文件-就像其他語言中的私有類變量一樣。 請注意,與大多數語言類變量不同,在@implementation
聲明的沒有 static
限定符的變量將添加到全局名稱空間中,從而增加了名稱沖突的機會-這就是為什么它們不是真實類變量的原因。
通常使用類方法+ initialize
此類類變量,就像使用實例方法- init
初始化實例變量一樣。
在類擴展中聲明它們通常用於嘗試向客戶端隱藏實例變量和關聯的訪問器。 兩種方法都不能真正地隱藏它們,但是隱藏它們通常是一種改進,並且僅當您需要的所有編譯器都支持時才可用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.