2011-07-22 74 views
47

我正在觀看WWDC ARC介紹視頻,在Apple的某個工程師談論Stack示例之前,我看到了在ObjC中從未見過的東西。在ObjC實現文件中聲明的實例變量

下面的代碼被用於堆例如與ARC:

@implementation Stack 
{ 
    // instance variable declared in implementation context 
    NSMutableArray *_array; 
} 

- (id)init 
{ 
    if (self = [super init]) 
     _array = [NSMutableArray array]; 
    return self; 
} 

- (void)push:(id)x 
{ 
    [_array addObject:x]; 
} 

- (id)pop 
{ 
    id x = [_array lastObject]; 
    [_array removeLastObject]; 
    return x; 
} 

@end 

請注意:@implementation指令後立即宣佈的實例變量。

現在讓我感到驚訝的是,實際變量實際上可以在實現文件中聲明,而不是一個靜態變量。我的問題將如下:

  • 這是一些新的構造引入SDK的iOS 5或有這可能很長一段時間嗎?
  • 如果實例變量不能在對象之外訪問,在實現中聲明實例變量是否是一種好的做法?它看起來更清潔,然後使用@private指令。
+0

你有一個完整的,可編輯的例子嗎? –

+0

上面的代碼應該在iOS 5 SDK中編譯得很好。 –

+0

如何在類擴展中添加iVars? –

回答

39

這實際上是一種新的語言功能,如果您必須聲明您的ivars(而不是簡單地聲明屬性並讓編譯器爲您生成ivars),這是一個好習慣。理論上你的頭文件應該只爲你的類暴露公共接口;其他一切都屬於實施。

有一點需要注意的是,實現文件ivars對於子類是不可見的,如果您有手動生成的setter和getters需要子類化,偶爾可能會有點尷尬。

+1

說我創建了一個只在實現文件中聲明它的ivars的類(「封裝」),但我想創建一個可變的子類「MutableA」。我如何才能訪問A中的實現ivars?注意:這些ivars沒有屬性或getter/setter。 – Grimless

+1

一位蘋果工程師向我介紹了這個新功能,並建議我使用它。直到看到NSAttribututedString.h並且找不到ivars時,纔會忘記它。 Objective-C主題「定義類」已相應更新,並且將界面中的ivars聲明爲「歷史」對於子類中的可見性 - 子類實現是否使用訪問函數? – GTAE86

+1

@ GTAE86是的,儘管我認爲使用頭文件聲明(或者頭文件和實現聲明的混合)仍然很常見。 –

17

在實現中聲明iVars絕對是目標C中的一個新構造。 您需要使用xcode4.2並在構建設置中選擇LLVM編譯器。 這個想法是保持你的頭文件更清潔。你可以像這個例子一樣列出花括號 裏面的ivars;

@implementation MyClass {  
    int var1; 
    int var2; 
} 

由拉胡爾給出的答案是不是真的正確的,儘管你可以在他說,他們將在靜態編譯器來看待的方式delare變量。可能對於他使用它們的情況來說並不重要。

+1

您還需要符合「Modern」Objective-C運行時的條件,該運行時根據https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtVersionsPlatforms.html提供iOS和OS X 10.5及更高版本的64位。 OS X 10.5以前版本和OS X 32位版本使用舊版運行時。 – bleater

4

我是新來的目標C,我發現在標題中聲明ivars的做法非常奇怪。它意味着在公開頭文件中聲明一個對象的內部狀態,這違背了封裝的概念。

例如說你擁有一個iPad。蘋果公司不希望你打破iPad打開並撬動周圍,並與內部元素混淆。如果他們希望你修改某些東西,那麼iPad會有一個設置讓你改變它。

同樣我不希望其他程序員看到我的對象的ivars。它是我的對象的內部狀態。如果我想讓你訪問內部狀態,我會爲它聲明屬性。

因此,和其他語言一樣,我會將我的ivars隱藏在執行文件中,而不是在頭文件中聲明它們。

在標題中聲明ivars只是讓我覺得非常奇怪。這些ivars是特定於實現的,並且不應該成爲頭文件的一部分。

相關問題