2012-02-28 65 views
1

可能重複:
what is this weird code notation mean(anObject *)在語句前做了什麼?

我以前問過這個問題......

Understanding memory management in ios

的一兩件事,質疑該行didnt教我(NSArray *)在以下聲明中做了什麼:

NSArray *myArray = (NSArray *)[someNSSet allObjects]; 

爲什麼不是它只是:

NSArray *myArray = [someNSSet allObjects]; 

或者換一種說法,你怎麼這兩種說法在他們做了什麼不同?目前我不明白(NSArray *)位,所以我只是無視它,對我來說他們看起來一樣!

在此先感謝

+0

這是一個類型演員。 – 2012-02-28 19:12:06

回答

3

這是一個類型轉換,它說「的返回值轉換爲這種類型的」†。這是在Objective-C沒有意義的,因爲id轉換和從任何其他對象指針類型,但其他一些語言需要更多的類型轉換,所以有些人這樣做是出於習慣,而其他人只是這樣做,因爲他們真的,真的喜歡明確性。

我一般會建議不要這樣做,因爲在很少發生錯誤的情況下(例如,該方法返回NSString*並且將它分配給NSArray*),這將抑制編譯器的警告。如上所述,如果方法確實返回兼容類型,則不需要執行此操作。所以盲目地做這件事只會在Objective-C中傷害你。

†關於轉換的注意事項:當您投射包含所有Objective-C對象類型的指針時,實際上並沒有改變指針所引用的東西的類型,而只是指針本身。所以你不能以這種方式將一種類型的對象變成另一種。如果你施放一個NSString*NSDictionary*,對象仍然是一個NSString - 你剛剛騙了關於它的編譯器,所以當你嘗試調用allKeys也不會提醒你,而是你的程序將只炸燬在運行。

+0

非常好,非常感謝您的解釋。 – 2012-02-28 19:28:35

0

這是一個類型轉換。在上述情況下,它是不是因爲[someNSSet allObjects];回報和NSArray*反正必要的,但你需要它,無論你需要指定對象(通常來自id)的類型,所以編譯器知道什麼方法調用實際生成。

1

這是一個類型轉換聲明。在簡單賦值的情況下,它是無關緊要的 - Objective C允許您爲任何類型變量指定一個無類型對象ref(id)。但是,無論如何,人們都會用C/C++惰性寫出它們。

有時是必需的。例如:

NSString *s = [(UILabel*)[myView viewWithTag:100] text]; 

在這裏,如果不是因爲類型轉換,你會得到一個編譯器警告UIView*可能不支持[text]。much..since你將其分配給數組

在這個case..it
0

都不會有問題..

而是採取了case..where分配IBActions.to按鈕,這樣

- (IBAction) clickedButton:(id) sender 
現在

在您要設置按鈕的α爲零此功能..

你知道你的按鈕將是發送者......既然你已經做了IBAction爲連接到..

但如果使用

sender.alpha = 0 ; 

雖然會工作,因爲這是事實,這是按鈕.. 但閱讀它不是best..and編譯器將你送到甚至連抱怨像intvalue這樣的方法..因爲它是ID ..

所以你鍵入大小寫到(UIbutton *) sender ..使編譯器理解它作爲一個按鈕,並執行其工作。

1

(NSArray *)是投到NSArray *然而,這是不需要的,因爲allObjects方法返回NSArray *

0

看起來你完全誤解了指針和類型。我去過那兒。在我讀了C傻瓜或smthng(尤其是指針部分)後,我明白了。這是基礎知識,你必須知道C.答案是:它是類型轉換。

+0

哇,這太糟糕了......但公平! - 我從來沒有做過C直接進入Objective-C! – 2012-02-28 19:27:52