今天开始学习oc的高级语法。首先学习了类目和延展。类目是为了扩展类的方法,不会改变原始类。可以新建一个文件表示类目,也可以把类目写到原始类里面。这样还可以给方法进行分类,把相同功能的方法放到一个类目中。例如,我在Car.中声明了两个类目,里面的方法有不同的作用。
//声明一个opretation类目
@interface Car (opretation)
-(void)run;
-(void)stop;
@end
//维护类目
@interface Car (maintain)
-(void)fix;
@end
Car类名后面的括号中的是类目名。类目的实现写在.m文件中,例如
//实现opretation类目
@implementation Car (opretation)
-(void)run{
NSLog(@"汽车启动");
}
-(void)stop{
NSLog(@"汽车停止");
}
@end
//实现maintain类目
@implementation Car (maintain)
-(void)fix{
//调用自己的私有方法
[self fixCar];
}
@end
类目为原始类扩展了一些方法,其他地方调用原始类里的方法时,也就可以调用类目里定义的方法。
延展是用来定义私有方法的,例如像java里private修饰的方法。写在.h文件中的方法都是可以被别人访问的,如果像定义私有方法,就可以写到延展中。不用延展定义私有方法也行,直接写在类的实现里。但是这样阅读和维护起来很麻烦,不能直接看出哪个是私有方法。于是最好还是把私有方法的定义写到延展中。延展于类目相似,但是延展的声明写在.m文件里,而且类名后面的括号为空的。例如
//延展,用于声明私有方法
@interface Car ()
-(void)fixCar;
@end
方法的实现写在类的实现里。这样就实现了一个私有方法。
@implementation Car
//......其他代码,这里省略
-(void)fixCar{
NSLog(@"修理汽车");
}
@end
主类的代码如下
#import <Foundation/Foundation.h>
#import "Car.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Car *car = [[Car alloc]initWithId:1001 andName:@"BYD"];
[car run];
[car stop];
[car fix];
}
return 0;
}