2013-05-22 112 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。