2010-04-10 47 views
2

我正在用一些客观的c语法挣扎了一下。有人可以在下面的实例方法中详细说明*的用法。在目标C语法中使用*语法

- (IBAction)sliderChanged:(id)sender{ 
    UISlider *slider = (UISlider *)sender; 
} 

我意识到,我们正在创建类型为UISlider一个变量,然后将其设置为发送者一旦被强制转换为UISlider。然而,我不明白什么*为什么

UISlider slider = (UISlider)sender; 

将无法​​正常工作。

+0

这是http://stackoverflow.com/questions/2189212/的重复。关于这个问题的答案提供了很多Objective-C的具体细节,为什么会出现这种情况。 – bbum 2010-04-10 20:03:43

回答

13

*,就像在C中一样,当在一个类型中使用时表示一个指针(比如你的情况)并且取消引用一个指针。

指针只是一个变量,其中包含其他内容的地址,在您的示例中是一个UISlider对象。

在你的例子

所以,

UISlider *slider = (UISlider *)sender; 

滑块UISlider *类型,或一个指向UISlider对象的。

关于C指针下面的教程也适用于Objective-C的: Everything you need to know about pointers in C

3

所有Objective-C对象都必须使用指针引用,因为它们位于堆而不是堆栈中。

2

您正在创建一个称为滑块的变量,其类型为UISlider *即指向UISlider的指针。

您正在将作为指向Objective C对象的指针的发送者的值分配给变量滑块,以便滑块和发件人指向同一段内存。

在Apple的Objective C中,所有对象都在堆中声明并通过指针访问。

+0

只是为了确保我已经得到它... 后 UISlider * slider =(UISlider *)sender; slider和sender都是指向内存中相同位置的指针? – user263097 2010-04-10 19:43:22

+0

是的,你是对的。记住“驻留在内存中的对象”和“指向它们的指针”之间的区别很重要。 – Yuji 2010-04-10 20:50:10

2

我觉得困惑来自使用的(ID)中:

- (IBAction)sliderChanged:(id)sender{ 
    UISlider *slider = (UISlider *)sender; 
} 

目标C有编号为的类型或多或少等同于(NSObject *)。它可以基本上指向任何类型的Objective C对象。所以,实际上上面的代码是这样的:

- (IBAction)sliderChanged:(NSObject*)sender{ 
    UISlider *slider = (UISlider *)sender; 
} 

或多或少。由于我们(程序员)知道sender对象是一个UISlider,我们在将对象赋值给UISlider *滑块时将该对象转换为(UISlider *)。