以下 2 个语句之间可能有什么区别?
UILabel *mainLabel = (id) [cell viewWithTag:10];
和
UILabel *mainLabel = (UILabel*) [cell viewWithTag:10];
以下 2 个语句之间可能有什么区别?
UILabel *mainLabel = (id) [cell viewWithTag:10];
和
UILabel *mainLabel = (UILabel*) [cell viewWithTag:10];
简短的回答:没有。
两种强制转换都将具有防止编译器警告指针类型不兼容的效果。
无论如何,由于在运行时不会检查 Objective-C 中的类型,因此在运行它时不会有什么不同。
事实上
UILabel *mainLabel = (id) [cell viewWithTag:10];
UILabel *mainLabel = (UILabel*) [cell viewWithTag:10];
UILabel *mainLabel = [cell viewWithTag:10];
在运行时是完全等价的。
唯一明显的区别是编译器会在第三种情况下警告您,因为类型似乎不兼容。由于Liskov 替换原则,实际上,您不能将泛型分配UIView
给 a UILabel
。通过强制转换它你告诉编译器:“相信我,我知道这会好的”。
但是,从这个角度来看,将其强制转换为id
并没有真正意义:您正在使类型更通用,而您应该将其缩小到适当的子类。
总结一下,作为一种好的做法,建议您将返回类型转换为您期望的确切类。它会更有意义,并且代码可读性也会更好。