[在线]一个obj-c语法的问题

大熊猫侯佩 版主
iOS开发领域优质创作者
博客专家认证
2014-11-20 07:26:18
Xcode6在开启了ARC后: clang -fobjc-arc -framework Foundation 1.m -o 1
代码编译不能通过:


#import <Foundation/Foundation.h>

@interface A:NSObject

-(void)mul:(double)x;
-(void)show;
@end

@implementation A

-(void)mul:(double)x{
printf("%f\n",100.001 * x);
}

-(void)show{
NSLog(@"[A obj]i : %f",100.001);
}
@end

@interface B:NSObject
-(void)mul:(int)x;
-(void)show;
@end

@implementation B

-(void)mul:(int)x{
printf("%d\n",10000 * x);
}

-(void)show{
NSLog(@"[B obj]i : %d",10000);
}
@end

int main(int argc,char *argv[])
{
@autoreleasepool{
id obj = [[A alloc] init];
[obj show];
[obj mul:123.12];
}
return 0;
}

报错原因是 error: multiple methods named 'mul:' found with mismatched result,parameter type or attributes
[obj mul:123.12];
^~~~~~~~~~~~~~~~
我想问的是:
1.如果mul方法无法确定是A还是B中的方法,那么show方法为什么能确定?
2.如果不开ARC:clang -framework Foundation 1.m -o 1虽然有警告,但编译运行都是正常的!求解?
注意B不是A的子类!他们都继承自NSObject!
...全文
784 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kinson_Wu 2014-12-02
  • 打赏
  • 举报
回复
NSMutableDictionary* dic = [NSMutableDictionary dictionary]; [dic objectForKey:@"size"] count] 我代码中也出现这问题,这些是库方法,该怎么处理
dtrugglrRookie 2014-11-22
  • 打赏
  • 举报
回复
2014-11-22 00:52:52.254 csdn问题[2157:303] [A obj]i : 100.001000 12312.123120 楼主没有问题的 你这里都没有用到B类,
伦敦iOS小牛 2014-11-22
  • 打赏
  • 举报
回复
A 和 B 的 implementation 应该在不同的.m 文件中
大熊猫侯佩 版主 2014-11-22
  • 打赏
  • 举报
回复
引用 9 楼 zhangao0086 的回复:
用类名替换id类型。 我给你写一个简单的例子:

@interface TestCounter : NSObject

- (TestCounter *)count;

@end

int 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运行时和编译时的问题
谢谢,你的解释比较清楚了,也解释了show的问题!
Bannings 2014-11-22
  • 打赏
  • 举报
回复
我建议如果OC干得足够深入的情况下(UIKit、CoreGraphics、Quartz等),想要进一步深入理解,才在编译器、运行时上下功夫,理解下断点原理、msg_send实现等。 过早发现这些问题反而会影响自己的理解。
Bannings 2014-11-22
  • 打赏
  • 举报
回复
用类名替换id类型。 我给你写一个简单的例子:

@interface TestCounter : NSObject

- (TestCounter *)count;

@end

int 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运行时和编译时的问题
大熊猫侯佩 版主 2014-11-22
  • 打赏
  • 举报
回复
引用 6 楼 dtrugglrRookie 的回复:
2014-11-22 00:52:52.254 csdn问题[2157:303] [A obj]i : 100.001000 12312.123120 楼主没有问题的 你这里都没有用到B类,
你可以编译通过吗?我的mac os x10.10.1 + Xcode6不可以哦
大熊猫侯佩 版主 2014-11-22
  • 打赏
  • 举报
回复
引用 5 楼 u014609935 的回复:
A 和 B 的 implementation 应该在不同的.m 文件中
所有代码都在同一个.m文件里啊
Tan_Trace 2014-11-21
  • 打赏
  • 举报
回复
你继承了NSObject的类,所以A和B是兄弟关系,重写了NSObject里面的show方法, 你能够找到,但当你编译的时候就冲突,编译出错。。
大熊猫侯佩 版主 2014-11-21
  • 打赏
  • 举报
回复
编译时候show没出错,是mul出错了!
大熊猫侯佩 版主 2014-11-20
  • 打赏
  • 举报
回复
show方法签名A和B都一样,为什么编译能正确识别?
rollrock1987 2014-11-20
  • 打赏
  • 举报
回复
参数问题?int ?

29,031

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧