2010-08-26 168 views
9

幾個星期前我開始學習Objective-C,但我仍然不明白如何正確管理類的封裝。在類中聲明私有成員變量的最佳方式是什麼?聲明私有成員變量

看起來,用「@property」爲你的成員變量設置正確的getter/setter是正確的方法,不僅僅是在界面中聲明它「@private」。但在我看來,這仍然給其他類訪問這些變量。即使您將屬性聲明爲「只讀」,外部類也可以訪問對成員變量的引用並對其進行修改!

所以我猜測聲明一個私有成員變量的最佳方式是不包含任何通過聲明屬性的三字代碼/ setter。我對嗎?或者,還有更好的方法?

感謝

回答

23

,如果你不希望它的其他類訪問,宣佈對你實行@property,創建一個匿名類爲類。

頭文件:

// MyClass.h 
@interface MyClass : NSObject { 
    NSObject *_privateObject; 
    NSObject *_readonlyObject; 
    NSObject *_publicObject; 
} 

@property (nonatomic, retain, readonly) NSObject *readonlyObject; 
@property (nonatomic, retain) NSObject *publicObject; 

@end 

實現:

// MyClass.m 
@interface MyClass() 
    @property (nonatomic, retain) NSObject *privateObject; 
    // Make it writable on the implementation 
    @property (nonatomic, retain, readwrite) NSObject *readonlyObject; 
@end 

@implementation MyClass 

@synthesize privateObject = _privateObject; 
@synthesize readonlyObject = _readonlyObject; 
@synthesize publicObject = _publicObject; 

這些是三個不同的性質的例子。

  • privateObject在其他類中不可見;
  • readonlyObject是可見的,但是隻讀;
  • publicObject是可見的,可以被get和set;
+0

好吧,所以使用一個類別我可以完全隱藏一個成員變量。但是我仍然不明白爲可見成員使用「只讀」的原因,因爲它將引用返回給對象。人們可以修改引用並在其上寫下,即使它沒有setter。 – 2010-08-26 02:41:15

+0

好點!我將嘗試調查目標-c給予的保護目標。我的猜測是,只要您嘗試更改被引用對象的值,它就會創建一個副本,並且更改不會傳播到受保護的對象。這裏是文檔:http://developer.apple.com/mac/library/documentation/cocoa/conceptual/objectivec/Articles/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW19 – vfn 2010-08-26 03:14:00

+0

@Oliver ,你會介意爲此創建另一個問題,並將你的代碼放在那裏,讓我們更好地理解這個問題。 BTW「無法識別的選擇器」意味着你沒有那個特定的選擇器,可以是屬性或方法。你確定你已經聲明瞭「readwrite」權限嗎? – vfn 2011-09-18 23:34:07