2012-02-03 27 views
5

將僞私有實例變量放在.m文件的類擴展中或將它們放入新引入的@implementation括號(如下所示)中,它們之間有什麼區別?在類擴展或@implementation塊中添加僞私有ivars有什麼區別?

是否有後果,優點,缺點或缺點? internal2的處理與程序員必須關心的內部3的處理方式不同嗎? (當然,麥凱會說有一個區別,但問題是如果你在實踐中是否在意)。

// MyClass.m 

@interface MyClass() { 
    id internal2; 
} 
@end 


@implementation MyClass { 
    id internal3; 
} 

- (void)internalMethod { 
    NSLog(@"%@ %@", internal2, internal3); 
} 

@end 

來源:http://www.mcubedsw.com/blog/index.php/site/comments/new_objective-c_features/

回答

9

這兩種方法之間的主要區別是,您可以將類擴展包含在單獨的頭文件中,而@implementation ivars顯然必須與.m文件中的@implementation塊一起使用(並且只能有一個給定類的@implementation(不包括擴展))。這樣做的實際結果是,你可以擁有的 「私人」 的ivars多個層次:

  • MyClass.h:公共的ivars
  • MyClass的+ Private.h:半私人的ivars
  • MyClass.m:真的私人ivars

作爲一個假設的例子,假裝MyClass是UIView。在這種情況下,UIView.h是我們都可以訪問的頭文件,UIView + Private.h是隻有Apple可以訪問的「私有」頭文件,而UIView.m的內容是隻有專門負責UIView的人需要知道關於。

+2

類可以有多個實現塊。它是類擴展的基礎。 – 2012-02-03 01:46:26

+0

當然可以。但是不涉及類別,一個類只能有一個@implementation。 – UIAdam 2012-02-03 01:52:20

+1

@EllNeal:分類'@ implementation's!= Class'@ implementation's – 2012-02-03 01:56:33

3

就個人而言,我更喜歡把我的ivars在一個類擴展在實現文件中,我認爲這是更清潔的方式。我認爲使用其中一個或另一個不會帶來任何性能優勢或後果,更多的是能夠按照自己的意願編寫代碼。

相關問題