2013-05-22 108 views
1

我看過使用'(ClassName *)'引用特定對象的代碼語句,如UITableViewCell *myCell = (UITableViewCell*)[self.view viewWithTag:1];「(ClassName *)」的功能是什麼

我不知道這是什麼意思或如何工作,我想增加我對這個概念的理解。

我也看到,方法聲明中也使用了相同的代碼,並希望瞭解它是否使用了相同的概念,如果不是,它們又有什麼不同,例如,

-(IBAction)myAction:(id)sender;

回答

9

充當類型轉換。它將指針的類型轉換爲括號內的類型。在這種情況下,它將UIView實例(`viewWithTag:的結果)轉換爲UITableViewCell的實例。

在ObjC中,對象類型轉換不會導致類型轉換。這就是說 - 沒有創建新實例。此外,在執行動態向下轉換時,類型轉換對象不會執行動態類型檢查(不像C++中的dynamic_cast或Java中的類型轉換(可能會引發異常))。

因爲-viewWithTag:回報UIView(或NSView在OS X),類型轉換是用來告訴編譯器「這是確定的 - 我知道這種類型的返回是一個UITableViewCell實例」。使用類型轉換允許您在變量的賦值表達式中從UIView降到其子類UITableViewCell,這允許您將該對象用作UITableViewCell,編譯器將消息或變量與類型匹配。如果沒有這種類型轉換,你會邏輯地使用它或者將它分配給一個UIView(或它的一個超類),如果你試圖使用實例的子類實現的方法,編譯器會抱怨。例如 - 您無法成功使用該變量訪問UITableViewCell.accessoryView屬性,而無需進行類型轉換,類型擦除或編譯器警告或錯誤。在這種情況下,類型轉換是最不可靠的。

現在在- (IBAction)myAction:(id)sender;的情況下,id是一個無類型的ObjC對象。它有一個特殊的區別,它不需要類型轉換。例如:

- (IBAction)myAction:(id)sender 
{ 
    NSString * currentTitle = nil; 
    currentTitle = sender.currentTitle; // << May be ambiguous to the compiler because `id` is not fully typed 

    UIButton * button = sender; // << OK assign id to variable of arbitrary ObjC object type 
    currentTitle = button.currentTitle; // << OK 

    UIButton * castButton = (UIButton*)sender; // << although unnecessary, some people use this form. 
    currentTitle = castButton.currentTitle; // << OK 
    ... 

    NSObject * object = button; // << OK. upcast from button to object. compiler knows it is an NSObject without typecasting. 

就個人而言,我只是把它包裝成所有參數 - 這是罰款,在方法聲明ObjC對象,只要你知道這是正在傳遞的參數的類型:

- (IBAction)myAction:(UIButton *)pButton 
{ 
    NSString * currentTitle = pButton.currentTitle; // << OK 
    ... 
+0

「它正在將UIView實例轉換爲UITableViewCell的實例」它正在轉換指針。只有一個實例 - 一個UITableViewCell實例,它不會更改。 「一個對象來對象類型轉換」你不能有一個「對象來對象類型轉換」;只有一個指向指針類型轉換的指針。 「因爲-viewWithTag:返回一個UIView」不,它返回'UIView *'。 「使用類型轉換允許你從UIView向下轉換到它的子類UITableViewCell」你從'UIView *'向下轉換爲'UITableViewCell *'。 – newacct

0

只是一個壓制編譯器警告所必需的類型轉換。 換句話說,它對編譯器[self.view viewWithTag:1]的說法是一個UITableViewCell。如果沒有這種轉換,編譯器會抱怨UIView不是UITableViewCell。