我看过使用'(ClassName *)'引用特定对象的代码语句,如UITableViewCell *myCell = (UITableViewCell*)[self.view viewWithTag:1];
。“(ClassName *)”的功能是什么
我不知道这是什么意思或如何工作,我想增加我对这个概念的理解。
我也看到,方法声明中也使用了相同的代码,并希望了解它是否使用了相同的概念,如果不是,它们又有什么不同,例如,
-(IBAction)myAction:(id)sender;
我看过使用'(ClassName *)'引用特定对象的代码语句,如UITableViewCell *myCell = (UITableViewCell*)[self.view viewWithTag:1];
。“(ClassName *)”的功能是什么
我不知道这是什么意思或如何工作,我想增加我对这个概念的理解。
我也看到,方法声明中也使用了相同的代码,并希望了解它是否使用了相同的概念,如果不是,它们又有什么不同,例如,
-(IBAction)myAction:(id)sender;
充当类型转换。它将指针的类型转换为括号内的类型。在这种情况下,它将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
...
只是一个压制编译器警告所必需的类型转换。 换句话说,它对编译器[self.view viewWithTag:1]的说法是一个UITableViewCell。如果没有这种转换,编译器会抱怨UIView不是UITableViewCell。
“它正在将UIView实例转换为UITableViewCell的实例”它正在转换指针。只有一个实例 - 一个UITableViewCell实例,它不会更改。 “一个对象来对象类型转换”你不能有一个“对象来对象类型转换”;只有一个指向指针类型转换的指针。 “因为-viewWithTag:返回一个UIView”不,它返回'UIView *'。 “使用类型转换允许你从UIView向下转换到它的子类UITableViewCell”你从'UIView *'向下转换为'UITableViewCell *'。 – newacct