一 建立一个OC的类
完整的写一个函数:需要函数的声明和定义。
完整的写一个类:需要类的声明和实现。
1.类的声明
声明对象的属性和行为
1 #import <Foundation/Foundation.h> 2 3 @interface Car : NSObject 4 { 5 @public 6 int speed;//速度 7 int wheels;//轮子 8 } 9 10 - (void) initSpeed:(int)speed withWheels:(int) wheels ; 11 12 - (void) run; 13 14 @end
第3行:NSObject目的是让Car这个类具备创建对象的能力。
第5行:@public 可以让外部的指针间接访问对象内部的成员变量。
第 6,7行:定义对象的属性。
第10行:定义一个有入参的行为。
第12行:定义对象的行为。只要是OC对象的方法,必须以减号 - 开头。
在OC方法返回值中任何数据类型都必须用小括号()扩中。
实现@interface中声明的方法。
2.类的实现
Car 类的实现。
1 #import "Car.h" 2 3 @implementation Car 4 5 - (void)run{ 6 NSLog(@"车子跑起来。车速是%d km/h,轮子数是%d", speed, wheels ); 7 } 8 9 - (void)initSpeed:(int)speed withWheels:(int)wheels{ 10 self -> speed = speed; 11 self -> wheels = wheels; 12 } 13 14 @end
第9行代码: 给对象的属性speed, wheels赋值初始值。不能在类的声明 @interface 中对属性就行初始化。
在xcode中,自动实现函数的实现:
输入 "-" , 然后输入函数的头几个字母,选中xcode自动弹出的方法。
3.类的调用
1 #import <Foundation/Foundation.h> 2 #import "Car.h" 3 4 int main(int argc, const char * argv[]) { 5 Car *car = [Car new]; 6 car -> wheels = 4; 7 car -> speed = 100; 8 [car run]; 9 10 [car initSpeed:200 withWheels:5]; 11 [car run]; 12 13 14 return 0; 15 }
第5行:在OC中,想执行一些行为,就接上一个中括号[行为执行者 行为名称] 。利用类来创建对象。
[Car new]会创建出一个新对象,并且会返回新对象本身(新对象的地址)。
第6,7行:给 car所指向对象的wheels,speed属性赋值。
第8行:给car所指向的对象发送一条run消息。
二对象与函数参数
例子1
1 #import <Foundation/Foundation.h> 2 #import "Car.h" 3 4 void test1(Car *newC){ 5 newC -> wheels = 5; 6 } 7 8 9 int main(int argc, const char * argv[]) { 10 Car *car = [Car new]; 11 car -> wheels = 4; 12 car -> speed = 100; 13 [car run]; 14 15 test1(car ); 16 [car run]; 17 18 return 0; 19 }
第16行代码的返回结果为:车子跑起来。车速是100 km/h,轮子数是5
内存图如下:
例子2
1 #import <Foundation/Foundation.h> 2 #import "Car.h" 3 4 void test2(Car *newC){ 5 Car *c2 = [Car new]; 6 c2 -> wheels = 5; 7 c2 -> speed =300; 8 9 newC = c2; 10 newC -> wheels = 7; 11 } 12 13 int main(int argc, const char * argv[]) { 14 Car *car = [Car new]; 15 car -> wheels = 4; 16 car -> speed = 100; 17 [car run]; 18 19 test2( car ); 20 [car run]; 21 22 return 0; 23 }
第20行代码的返回结果为 车子跑起来。车速是100 km/h,轮子数是4
内存图如下:
面向对象封装的好处:
1)更加接近人类的思考方式。
2)只需要关注对象,不需要关注步骤。
三 OC对象的类型判断
1 #import <Foundation/Foundation.h> 2 3 @interface A: NSObject 4 5 @end 6 7 @implementation A 8 9 @end 10 11 12 @interface B : NSObject 13 14 @end 15 16 @implementation B 17 18 @end 19 20 21 int main(int argc, const char * argv[]) { 22 A *a = [[A alloc]init]; 23 NSLog(@"%d" , [a isKindOfClass:[NSObject class]]); 24 NSLog(@"%d" , [a isKindOfClass:[A class]]); 25 NSLog(@"%d" , [a isKindOfClass:[B class]]); 26 27 return 0; 28 }
返回结果
1 2016-03-06 12:56:18.105 T3[673:22236] 1 2 2016-03-06 12:56:18.106 T3[673:22236] 1 3 2016-03-06 12:56:18.106 T3[673:22236] 0