2012-02-24 88 views
1

使其擁有的類可由其寫入但由其他類只讀的iVar的最佳方式是什麼?公共iVar;從其他類讀取

有多種方法嗎?

我能想到的唯一方法是爲iVar設置一個@property (readonly),但不能在擁有的類中使用點符號(我猜測它不會只讀),並且在擁有的類中只引用它直接,沒有點符號,然後在其他類中,用點符號引用它。

但我很好奇,如果有其他方法。

回答

4

您可以使屬性讀/寫僅用於實現。您可以在您的實施中使用類擴展名或匿名類別來執行此操作。容易證明的話,例如,在您的.h:

@interface MyClass 

@property (readonly) NSInteger age; 
... 

@end 

並在您的m:

@interface MyClass() // class extension/anonymous category for private methods & properties 
         // implementation of these go in main @implementation 

@property (readwrite) NSInteger age; 
... 

@end 

@implementation MyClass 

@synthesize age; 
... 

@end 

現在你可以你的類讀/寫中使用的屬性,並從外面讀-只要。

你對私人方法也是這樣。

[注意:這是Objective-C,所以上述內容不是防彈的 - 有方法調用屬性設置器 - 但編譯器會標記從類外部指定屬性的錯誤。]

後評論:

[注2:一個匿名類/擴展是非常相似的命名類別。前者必須執行的主要實現,後者可以實現在@implementation classname (categoryname)或主要實現。此外,只有主接口,類擴展/匿名類接口和主實現可以聲明實例變量;指定類別的接口和實現可能不會。屬性可以在匿名類和命名類中聲明,但是它們只能在主實現中合成,而不能在命名類實現中合成。這個註釋在發佈時是正確的,其中一些功能已經隨着Objective-C/Xcode的發展而發生了變化。]

+0

謝謝;兩個後續問題:如果你命名類別 - 我經常看到人們將私有聲明放在私人聲明中,那麼另一個類訪問財產的二傳手是什麼方法,即使公有財產是讀寫? – johnbakers 2012-02-24 05:36:47

+0

我已經對他原來的帖子進行了一些修改,希望他會批准它們,但是它的信息不正確。這是一個類擴展而不是一個類,2個非常不同的東西。 – 2012-02-24 05:42:40

+0

謝謝,我學到了一些新東西! – 2012-02-24 06:05:59

0

使用私有說明符作爲ivars和類擴展來定義訪問者 - 這種方式ivar是私有的班上。

// FooClass.h @interface FooClass:NSObject {} {private void bo bo;

} @end

// FooClass。米

@interface FooClass(){

}

@屬性(非原子,分配)INT噓聲;

@end

@implementation FooClass

@synthesize噓聲; // ...

@end