2013-04-06 71 views
1

可以爲常量創建getter和setter嗎?我想直接引用一個常量,並且如果它的值爲零,就讓它自己實例化。聲明如下常量:常量的吸氣和吸氣裝置?

// Prefs.h 
extern MyClass * const kThing; 

// Prefs.m 
MyClass * const kThing = nil; 

和的getter/setter看起來像:

// getter 
+ (MyClass *)kThing 
{ 
    _kThing = _kThing ? : [MyClass new]; 
    return _kThing; 
} 

// setter 
+ (void)setKThing:(MyClass *)myClass 
{ 
    _kThing = myClass 
} 

然後我可以用它喜歡:

[kThing doSomething]; 

這可能嗎?

編輯編輯的方法類方法

+1

你是否將'kThing'聲明爲全局變量?如果是這樣,爲什麼getter和setter實例方法? – drewmm 2013-04-06 02:46:38

+0

@drewmm是的,我希望它是一個全球常數。我將其改爲類方法以使其更清晰。雖然我不確定那些應該是哪些類的成員......我只是用它作爲例子。 – zakdances 2013-04-06 02:48:49

+0

查找單詞constant的時間.. ?? – Rob 2013-04-06 02:49:56

回答

1

全局變量聲明在另一個文件是非常危險的客觀C.理想的情況下,我們使用sharedInstance。試試這樣:

在MyGame.h

@interface MyGame : NSObject 
{ 
    int mScore; 
} 
@property(nonatomic,assign) int score; 
+(MyGame*)sharedObject; 
-(void)someFunction; 
@end 

在MyGame.m

static MyGame *gGame = nil; 

@implementation MyGame 

@synthesize score = mScore; 

+(MyGame*)sharedObject 
{ 
    if(!gGame) 
    { 
     gGame = [[MyGame alloc] init]; 
    } 
    return gGame; 
} 

-(void)someFunction 
{ 

} 
@end 

要訪問項目的任何地方:

 #import "MyGame.h" 

    [MyGame sharedObject].score; 
    [MyGame sharedObject] someFunction]; 
+1

在任何地方使用globale是非常危險的。導致鏈接器中出現一些可怕的隱式屏蔽和雙重符號 – CodaFi 2013-04-06 03:16:02

2

你描述的不是常量,它們是全局變量。你不能爲它們定義getter和setter,但是你可以使用它們的值返回類方法,這正是你所做的。

但是,當你發送郵件這樣

[kThing doSomething]; 

全局變量,直接使用,繞過你消氣。如果你想通過一個getter,你可以寫

[[MyClass kThing] doSomething]; 

MyClass內部方法,你可以寫

[[[self class] kThing] doSomething]; 

另外一個需要注意的是,當喲實現存取方法一樣,你應該做的支持變量static,而不是extern。這將確保其他模塊不能訪問這些繞過你的getters的變量。

1

簡而言之,這是不可能的。

MyClass * const kThing = nil; 

意味着kThing是一個常量指針,這意味着在存儲器它指向的地址不能被改變。所以一旦它設置爲nil,它不能以後被設置爲一個新的對象。