-5

今天我阅读了 Carlo Chung 的“iOS 的 Pro Objective-C 设计模式”。所以我阅读了适配器模式并看到了在协议中声明的这个方法:

-(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];
 }

声明中的 * 是什么意思 (*red, *green, *blue) 和 & (&redValue...) 是什么意思?我看到 & 代码中只有 &error 。

4

2 回答 2

5

*是指针声明符或取消引用运算符。在声明中,* 表示指针变量。

&是地址运算符。

边注:

在尝试更高级的书籍之前,您应该学习语言的基础知识。

于 2013-02-06T12:31:18.483 回答
2

正如一些人所指出的,这些与指针有关。有大量关于此的信息,但是,如果您是新手,您可能会发现它有点混乱。

指出你需要知道的...

大多数时候你有一个函数的输入和输出。

- (int)roundMyFloat:(float)float;

这里输入是浮点数,输出是整数。

有时您需要一个方法的多个输出。一种常见的情况是您可能希望返回错误代码以及成功参数。

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

你会这样使用它......

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

您将传入error作为“输出参数”。的代码doSomthing将接受您的错误并在需要时填写信息。

您需要*在方法声明中用两个 's声明错误参数,(NSError**)因为您说您想要一个指向错误对象的指针,而错误对象实际上是一个指针本身 - 所以它是一个指向指针的指针。

当您将错误传递给方法[myInstance doSomething:&error];时,您使用&符号表示“获取我的错误对象的内存地址”。

在您的示例中red green,并且blue是输出参数。该方法didRequestColorComponentsForRed正在更改您传递给它的值。与NSError示例不同,red green它们blue不是对象,因此它们只需要在方法声明中加一颗星。这表示“接受指向CGFloat值的指针作为参数”。

当您调用该didRequestColorComponentsForRed方法时,您使用符号传递颜色组件,&就像在 NSError 示例中一样。这表示获取我的CGFloat值的内存地址并将其传递给函数。

现在不要太担心&and*语法 - 只要记住它的用途(输出参数)。您最终应该阅读它以解决它(实际上它很酷!)。

希望这会有所帮助——不要害怕提问。

于 2013-02-06T12:57:32.810 回答