2010-04-10 29 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 *)。