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];