解决方案 »

  1.   

    show方法签名A和B都一样,为什么编译能正确识别?
      

  2.   

    你继承了NSObject的类,所以A和B是兄弟关系,重写了NSObject里面的show方法, 你能够找到,但当你编译的时候就冲突,编译出错。。
      

  3.   

    编译时候show没出错,是mul出错了!
      

  4.   

    A 和 B 的 implementation 应该在不同的.m 文件中
      

  5.   

    2014-11-22 00:52:52.254 csdn问题[2157:303] [A obj]i : 100.001000
    12312.123120
    楼主没有问题的 你这里都没有用到B类,
      

  6.   

    你可以编译通过吗?我的mac os x10.10.1 + Xcode6不可以哦
      

  7.   

    用类名替换id类型。
    我给你写一个简单的例子:@interface TestCounter : NSObject- (TestCounter *)count;@endint main(int argc,char *argv[])
    {
        @autoreleasepool{
    //        id obj = [[A alloc] init];
    //        [obj show];
    //        [obj mul:123.12];
            [(id)[TestCounter new] count];
        }
        return 0;
    }这个例子一样会报同样的错误,这是为什么呢?我取得了一个TestCounter的实例,但是我把它转为了id类型,然后用id类型调用了count方法,此时编译器会遍历所有的可见头的count方法,编译器当然会找到多个定义,因为count方法在NSArray,NSSet等等这些类上也有实现,而且我的TestCounter的count方法返回的是一个TestCounter对象,这和NSArray,NSSet等的count方法返回NSUInteger类型不一样,所以编译器会给你一个异常,注意看这个异常描述:
    multiple methods named 'count' found with mismatched result, parameter type or attributes.
    那为什么把NSArray转成id类型调用count方法不会有错呢?因为Foundation框架的所有count方法的返回值都是一个NSUInteger类型,编译器找到的签名自然都是一样的,那我们把TestCounter的count的返回值也改成NSUInteger呢?你可以试试。
    在这版块待了这么久,很少见有人问OC运行时和编译时的问题
      

  8.   

    我建议如果OC干得足够深入的情况下(UIKit、CoreGraphics、Quartz等),想要进一步深入理解,才在编译器、运行时上下功夫,理解下断点原理、msg_send实现等。
    过早发现这些问题反而会影响自己的理解。
      

  9.   

    谢谢,你的解释比较清楚了,也解释了show的问题!
      

  10.   

    NSMutableDictionary* dic = [NSMutableDictionary dictionary];
    [dic objectForKey:@"size"] count]我代码中也出现这问题,这些是库方法,该怎么处理