- (void) doSomething: (id)with {
int a;
a = [with doSomething];
}
编译器如何知道[with doSomething]
将返回什么类型?它是否假设int
,因为那是我要分配的内容?
答案 0 :(得分:3)
它不确定返回什么类型,因为doSomething可以通过几个不同的类使用不同的返回类型来实现。
我相信编译器会查找具有该名称的所有方法实现,并确保其中至少有一个在上面的示例中返回一个int。如果“doSomething”签名都没有返回int,则会发出警告。
答案 1 :(得分:2)
编译器知道当前可见的所有方法。如果它具有您要发送的消息的类型,则使用该类型。如果它知道所有具有该选择器的多种方法类型,它将任意选择一个,从而导致警告和可能的错误。如果它不知道任何此类方法的类型,它将假定该方法返回id
。