使其擁有的類可由其寫入但由其他類只讀的iVar的最佳方式是什麼?公共iVar;從其他類讀取
有多種方法嗎?
我能想到的唯一方法是爲iVar設置一個@property (readonly)
,但不能在擁有的類中使用點符號(我猜測它不會只讀),並且在擁有的類中只引用它直接,沒有點符號,然後在其他類中,用點符號引用它。
但我很好奇,如果有其他方法。
使其擁有的類可由其寫入但由其他類只讀的iVar的最佳方式是什麼?公共iVar;從其他類讀取
有多種方法嗎?
我能想到的唯一方法是爲iVar設置一個@property (readonly)
,但不能在擁有的類中使用點符號(我猜測它不會只讀),並且在擁有的類中只引用它直接,沒有點符號,然後在其他類中,用點符號引用它。
但我很好奇,如果有其他方法。
您可以使屬性讀/寫僅用於實現。您可以在您的實施中使用類擴展名或匿名類別來執行此操作。容易證明的話,例如,在您的.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的發展而發生了變化。]
使用私有說明符作爲ivars和類擴展來定義訪問者 - 這種方式ivar是私有的班上。
// FooClass.h @interface FooClass:NSObject {} {private void bo bo;
} @end
// FooClass。米
@interface FooClass(){
}
@屬性(非原子,分配)INT噓聲;
@end
@implementation FooClass
@synthesize噓聲; // ...
@end
謝謝;兩個後續問題:如果你命名類別 - 我經常看到人們將私有聲明放在私人聲明中,那麼另一個類訪問財產的二傳手是什麼方法,即使公有財產是讀寫? – johnbakers 2012-02-24 05:36:47
我已經對他原來的帖子進行了一些修改,希望他會批准它們,但是它的信息不正確。這是一個類擴展而不是一個類,2個非常不同的東西。 – 2012-02-24 05:42:40
謝謝,我學到了一些新東西! – 2012-02-24 06:05:59