2011-04-11 102 views
2

我想知道在cocoa中聲明私有實例變量的建議是什麼。這個問題是在iPhone上開發應用程序的上下文中。在cocoa中聲明私有變量的最佳方法

我知道的至少三種方式宣告私有變量:

  1. 聲明它們在.h文件與修改@private接口:

    @interface MyClass : NSObject { 
        @private 
        NSObject * myPrivateVar; 
    } 
    
  2. 聲明他們m文件的實現部分:

    @implementation MyClass 
    NSObject * myPrivateVar; 
    
  3. De克萊爾在M檔的接口屬性(甚至沒有聲明變量本身):

    @interface MyClass() 
    @property (nonatomic, retain) NSString* myPrivateVar; 
    @end 
    @implementation 
    @synthesize myPrivateVar; 
    

到目前爲止,我已經廣泛使用2,但最近開始意識到這可能是危險的,由於缺乏的垃圾收集。是否有使用該方法完全可以接受的情況?

3更合適嗎?答案是否取決於對象類型(例如mutable/immutable)?

參考材料的指針討論了使用/不使用屬性的權衡也值得讚賞。

+0

iPhone上沒有垃圾回收。 – ughoavgfhw 2011-04-11 04:17:59

+0

既然你寫了這個,也可以在實現中聲明一個iVar,如下所示: '@implementation MyClass { NSObject * myPrivateVar; }' – mahboudz 2014-09-15 22:16:47

回答

5

你三個選項有不同的語義:

  1. 這將創建一個實例變量。如果沒有垃圾回收,您需要將retain/release對象存儲到myPrivateVar中。
  2. This does not定義了一個實例變量。定義在@interface之外的變量和許多方法(或函數)定義的範圍是「全局」 - 有效的類變量(Objective-C沒有特殊的語法)。 MyClass的所有實例共享此變量。
  3. 使用屬性(帶或不帶變量被顯式聲明)之間的區別歸結於內存管理。定義爲retain表示當您沒有垃圾回收時,不需要retain/release

所以不要使用2!如果你沒有垃圾收集,選項3顯然有好處,它提供了對選項1的一些抽象,並且成本更高 - 儘管你可能沒有注意到大量訪問變量的計算密集型代碼之外的差異。

更新2015

垃圾收集上面ARC(自動引用計數)使用現在更適用(垃圾收集現在已經過時)。還現在有一個第四選擇:

  • 聲明他們在米文件的執行部分:

    @implementation MyClass 
    { 
        NSObject * myPrivateVar; 
    } 
    

    不同於選項(2)這確實聲明一個實例變量。該變量對於實現是私有的,並且ARC存儲器管理是自動的。這和(3)[順便也不再需要@synthesize]之間的選擇歸結爲選擇和需要;屬性給你點語法,自定義setter和/或getter的能力,以及賦值時自動拷貝的屬性,但是如果你不需要這些屬性,你可以簡單地使用一個實例變量。

  • +0

    謝謝。我很驚訝選項2宣佈了一個靜態,我寫了一個小測試來說服自己。事實上,你是對的。我知道的很少。選項3似乎確實是不需要是靜態的私有變量的最佳方法。 – double07 2011-04-13 23:46:17