首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Iphone >

菜鸟对obj-c类方法互相调用顺序的疑惑

2012-12-21 
初学者对obj-c类方法互相调用顺序的疑惑刚开始学习obj-c,遇到一个很初级的问题,就是假如在同一个类里有两

初学者对obj-c类方法互相调用顺序的疑惑
刚开始学习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这样设计的原理是什么?
[解决办法]
不会有这种问题的,你应该再检查一下是不是问题出在别的地方。
方法的顺序跟这个没关系的。
[解决办法]
自己搞明白了,最近苹果才针对此问题做出了改进,可以参考下面这篇文章:
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,以上代码在最新的编译环境下正常运行。"

热点排行