刚开始学习obj-c,遇到一个很初级的问题,就是假如在同一个类里有两个方法funA和funB,如果存在互相调用,那么被调用的那个函数必须写在调用函数的前面,否则编译无法通过。也就是说这样写是不行的:- (void)funA{    [self funB];}-(void)funB{    //do something}只能把funB的声明放在funA的上面,才可以:-(void)funB{    //do something}- (void)funA{    [self funB];}在我接触的其它高级语言(java,c#),好像是没有此现象出现的,我知道obj-c其实是c语言的一个扩张,它难道是必须按代码顺序加载?想请教一下大家,必须得这样写吗?obj-c这样设计的原理是什么?

解决方案 »

  1.   

    自己搞明白了,最近苹果才针对此问题做出了改进,可以参考下面这篇文章:
    http://www.infoq.com/cn/articles/wwdc2012-objective-c-new-feature摘录原文部分内容:
    "今年2012的WWDC上,苹果针对Objective-C和LLVM编译器都做了重大改进,我们来看一看Objective-C增加了哪些新特性。
    1、方法顺序无关
    Objective-C类由声明文件h和实现文件m组成,所有的public方法都在h文件中声明,private方法可以写在m文件中,但是在早期的编译环境中需要注意方法的顺序,例如下面的代码,在早期的编译环境会给出警告:类和方法声明:@interface ObjcNewFeatures : NSObject
    -(void)doSomething:(NSString *) text;
    @end
    实现:@implementation ObjcNewFeatures
    -(void)doSomething:(NSString *)text{
        NSLog(@"%@", [text stringByAppendingFormat:[selfgetCode]]);
    }
    -(NSString *)getCode{
        return@"Unicode";
    }
    @end
    早期编译器编译时会出现:warning: instance method ‘-getCode:’ not found…这是因为根据编译顺序,编译器不知道在doSomething之后还有getCode方法,所以会给出警告。解决办法有多种,比如可以把getCode方法放到doSomething之前,也可以提前声明私有方法,如下: 在m文件中增加:@interfaceObjcNewFeatures()
    -(NSString *)getCode;
    @end
    新版编译器在LLVM中增加了新特性,改变了顺序编译的方式,首先扫描方法声明,然后再对其实现部分进行编译。这样无论是public还是private方法,就变得顺序无关了。目前XCode的最新版本4.3.3采用的默认编译器是Apple LLVM compiler 3.1,以上代码在最新的编译环境下正常运行。"