2015-01-21 68 views
0

我宣佈在循環的實現文件的私有變量沒有明顯的接口。的Xcode 6 - 私人會員

myclass.m

@interface myclass() 

@property (nonatomic) unsigned int number; 

@end 

好吧,當我把在main.m文件是這樣的:

myclass * some = [[myclass alloc] init]; 

[some setNumber:10]; // no visible @interface for 'myclass' declares the selector 'setNumber'. 

unsigned int a=[some getNumber]; //no visible @interface ... 

上StackOverflow.com每一個答案點作爲我這樣做。問題是什麼?

回答

0

問題是,屬性number是一個私有屬性,因爲您在.m文件的接口部分中聲明瞭它。聲明它在頭myclass.h文件接口塊代替..甲私人財產,實例變量或方法是一個只能從myClass的對象的一個​​實例中,通過使用自關鍵字(這基本上是一個指針訪問到您當前正在執行的myClass實例)。

移動你的財產申報的頭文件將會使財產從類實例外部訪問。換句話說,它使公開


如果要限制對數據的訪問屬性點,定義在頭文件屬性爲只讀屬性:在

MyClass.h

@interface MyClass : NSObject 

    @property (nonatomic, readonly) unsigned int number; 

@end 

然後你.m文件手動創建私人伊娃,並覆蓋數字屬性的獲取方式如下:

MyClass.m

@implementation MyClass { 
    //Instance variable (ivar) 
    unsigned int _number; 
} 

unsigned int number() 
{ 
    return _number; 
} 

@end 

這樣一個子類(或任何其他爲此事)不能與數字的值淤泥。然後,您可以按如下方式訪問主功能中的號碼:

MyClass* myClass = [[MyClass alloc] init]; 
unsigned int newNumber = myClass.number; //There is no such selector called getNumber BTW, only number. 
+0

嗯,但這樣所有的子類將有權訪問該私有變量。我只希望myclass的實例有權訪問。 – vladimir 2015-01-21 01:12:06

+0

最後回答...這有點你在找什麼? – Ron 2015-01-21 01:32:01

+0

但我不希望它是**公共**。我希望它是**私人**。你能否重寫我的代碼,以便我能看到你的建議。我不明白。 – vladimir 2015-01-21 01:38:38

0

您可以使用只讀/ readwrite屬性定義來實現此目的。

在MyClass.h

@interface MyClass : NSObject 

@property (nonatomic, readonly) NSNumber *number; 

@end 

在MyClass.m

@interface MyClass() 

@property (nonatomic, readwrite) NSNumber *number; 

@end 

現在,您可以閱讀number屬性的類之外,你只能改變它在MyClass.m裏面。你可以在MyClass.m裏設置它的值,如self.number = 5

Objective-C沒有像Java這樣的語言具有的相同類型的專用變量。你想用私有變量來完成什麼?

+0

是否有標準的方式來訪問私有成員,而無需在.h文件中聲明它? – vladimir 2015-01-21 02:02:54

+0

我想隱藏繼承的私有變量。例。類員工具有accessCode。但是派生於類Employee的類Person可以訪問accessCode。我希望你能理解我。 – vladimir 2015-01-21 02:06:51

+0

我認爲你有這個倒退,員工應該是Person的一個子類......因爲員工首先是一個人,然後是一個員工。創建一個Person類,然後創建一個Employee類。 'Person'將無法訪問任何'Employee'的屬性。 – timgcarlson 2015-01-21 02:24:18