1.3 创建一个类
1、问题
面向对象的程序员喜欢能够将功能封装进对象中。此时,就需要定义一个类来封装属性和行为。
2、解决方案
Objective-C中的类需要有接口和实现定义。尽管不是绝对必要,但通常要将接口和实现分开放到不同的文件中。这2个文件的名字是一样的,但接口文件的扩展名是.h。
类文件的扩展名是.m。
要使用一个类,你必须将该类头文件导入到代码中。
3、原理
假如要定义一个Car类。
在Car.h中,放的是Car类的接口。类接口必须以@interface开头,以@end结尾。在这2者之间定义的就是类的属性和方法。
#import <Foundation/Foundation.h>
@interface Car : NSObject // 意思是说你的car是NSObject的一个子类,NSObject是Objective-C的根对象。
@end
说明:NSObject类具有管理iOS提供的运行时的能力。继承自它的对象可以利用Objective-C出色的内存管理模型。
在Car.m中,要先导入Car.h,然后用@implementation声明正在实现一个自定义类。
#import "Car.h"
@implementation Car
@end
要使用你的类,就需要导入Car.h,然后从该类实例化一个对象。要实例化一个对象,就要发送2条消息:alloc和init。它们都来自超类NSObject。
【当实现一个新对象时,不要覆盖alloc方法,这个方法是由NSObject声明的。与之相反的是,请覆盖init方法,创建自定义的初始化方法,因为NSObject提供的init方法只是起占位作用】
Car *car = [[Car alloc] init];
4、代码
//==============Car.h
#import <Foundation/Foundation.h>
@interface Car : NSObject
@end
//===============Car.m
#import "Car.h"
@implementation Car
@end
//==================main.m
#import "Car.h"
int main (int argc, const char * argv[]){
@autoreleasepool {
Car *car = [[Car alloc] init];
NSLog(@"car is %@", car);
}
return 0;
}
5、运行代码
clang -fobjc -framework Foundation Car.m main.m -o maccommandlineapp