Objective c 铸造到id和真实类类型之间的差异,目标C
以下两种说法有什么不同Objective c 铸造到id和真实类类型之间的差异,目标C,objective-c,Objective C,以下两种说法有什么不同 UILabel *mainLabel = (id) [cell viewWithTag:10]; 及 简单回答:没有 这两种类型转换都可以防止编译器发出有关指针类型不兼容的警告 无论如何,由于Objective-C中的类型在运行时不会被检查,所以在运行它时不会有任何区别 事实上 UILabel *mainLabel = (id) [cell viewWithTag:10]; UILabel *mainLabel = (UILabel*) [cell viewWithTa
UILabel *mainLabel = (id) [cell viewWithTag:10];
及
简单回答:没有
这两种类型转换都可以防止编译器发出有关指针类型不兼容的警告
无论如何,由于Objective-C中的类型在运行时不会被检查,所以在运行它时不会有任何区别
事实上
UILabel *mainLabel = (id) [cell viewWithTag:10];
UILabel *mainLabel = (UILabel*) [cell viewWithTag:10];
UILabel *mainLabel = [cell viewWithTag:10];
在运行时完全等效
唯一值得注意的区别是编译器会在第三种情况下警告您,因为类型看起来不兼容。事实上,由于的原因,您无法将通用的UIView
分配给UILabel
。通过铸造它,你告诉编译器:“相信我,我知道这一切都会好的。”
然而,从这个角度来看,将其转换为id
并没有真正意义:您正在使类型更通用,而您应该将其缩小到适当的子类
总而言之,作为一种良好的实践,建议您将返回类型强制转换为您期望的确切类。它会更有意义,而且对代码可读性也会更好。如果不清楚,编译器在将
id
分配给其他对象时不会发出警告,即使id
更一般正确。一般来说,id
的语义类似于:“编译器,别挡道,这会很好地工作”唯一的例外是点表示法;如果没有编译器的抱怨,您不能将它与id
一起使用。
UILabel *mainLabel = (id) [cell viewWithTag:10];
UILabel *mainLabel = (UILabel*) [cell viewWithTag:10];
UILabel *mainLabel = [cell viewWithTag:10];