2013-02-06 89 views
-4

今天我讀了Carlo Chung的「Pro Objective-C iOS設計模式」。 所以我讀到適配器模式,看到這種方法在協議中聲明:什麼意思*和&

-(void) command: (SetStrokeColorCommand *) command 
     didRequestColorComponentsForRed: (CGFloat *) red 
            green: (CGFloat *) green 
            blue: (CGFloat *) blue; 

你可以看到它115頁的從書。 比這種方法使用

[delegate_ command:self didRequestColorComponentsForRed: &redValue 
                green: &greenValue 
                blue: &blueValue]; 

然後頁面上使用此方法的聲明118

-(void) command: (SetStrokeColorCommand *) command 
     didRequestColorComponentsForRed: (CGFloat *) red 
            green: (CGFloat *) green 
            blue: (CGFloat *) blue 
{ 
    *red = [redSlider_ value]; 
    *green = [greenSlider_ value]; 
    *blue = [blueSlider_ value]; 
} 

什麼意思*在聲明(*紅色*綠色*藍),什麼意思&(& redValue ...)?我看到&代碼中只有&錯誤。

+11

閱讀C或C++中指針的一些材料。 – CRDave

+0

嗯...'指針'? – sgarizvi

+3

&是操作符的地址,*將變量聲明爲指針,或者取消已經聲明的變量http://www.cplusplus.com/doc/tutorial/pointers/ –

回答

6

*是指針聲明符或解引用運算符。 在一個聲明中,*表示一個指針變量。

&是地址運算符。

旁註:

你應該學會一門語言的基礎知識,嘗試更先進的書之前。

2

正如有人指出的,這些都與指針有關。有關於此的大量信息,但是,如果你是新手,你可能會發現它有點混亂。

要指出,你需要知道什麼?

你們中的大多數具有輸入和輸出功能的時間。

- (int)roundMyFloat:(float)float; 

這裏輸入是浮點數,輸出是int。

有時您需要多個輸出到一個方法。常見的情況是您可能想要返回錯誤代碼以及成功參數的位置。

- (BOOL)doSomthing:(NSError**)error; 

你會使用這個像這樣...

NSError* error = nil; 
BOOL sucess = [myInstance doSomething:&error]; 
if (!sucess) 
{ 
    NSLog(@"Error: %@", error); 
} 

您傳入error作爲 '輸出放慢參數'。 doSomthing的代碼會將您的錯誤填入信息中(如果需要)。

您需要在方法聲明的申報錯誤的參數,因爲你說你想要一個指向錯誤對象和錯誤對象實際上是一個指針本身 - 所以它是一個指針的指針。

當您將錯誤傳遞給方法[myInstance doSomething:&error];時,您使用&符號來說'取我的錯誤對象的內存地址'。

在你的例子中red​​和blue是輸出參數。方法didRequestColorComponentsForRed正在改變您傳遞給它的值。與NSError示例不同,red​​和blue不是對象,所以它們只需要方法聲明中的一個星號。這表示'接受指向CGFloat值的指針作爲參數'。

當您調用didRequestColorComponentsForRed方法時,就像使用NSError示例一樣,使用&符號傳入顏色成分。這表示採取我的CGFloat值的內存地址並將其傳遞給該函數。

現在不用太擔心&*的語法 - 只記得它的用途(輸出參數)。你最終應該閱讀它來解決它(其實它很酷!)。

希望有幫助 - 並且不要害怕問問題。