刚开始学习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这样设计的原理是什么?
解决方案 »
- ios开发中用tableView:viewForFooterInSection:实现的表脚,怎么使其随表滚动?
- 新手问题:关于Image View的使用
- iOS开发的样式
- IPhone, OPhone到底是怎么回事啊?
- 苹果TS流打包过程的一些问题
- SDK是7.1,ios development target 选择 6.0,苹果拒绝,有经验的明示下!
- iOS客户端登录网页
- 物理小游戏 - 《对准了射》
- 微信支付的退款流程问题
- 关于UIButton使用setAttributedTitle:forState:之后无法改变标题颜色
- 基于java webservice做Ipone后台开发
- 系统默认弹出UIAlertView大小是多少?
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,以上代码在最新的编译环境下正常运行。"