OC是一门面向对象的开发语言,而C语言是面向过程的,因此在开发思想上要把面向过程和面向对象好好区分开来,体会其中的不同之处。面向过程关注的是解决问题需要哪些步骤,而面向对象关注的是解决问题需要哪些对象。
1. 类的设计
在C语言中完整的写一个函数需要函数的声明和定义(也就是实现),而OC中类似,完整的写一个类需要类的声明和实现
类的设计主要包括:类名,属性和行为。
OC中类名的第一个字母必须是大写。不能有下划线。多个英文单词,用驼峰标识。
2. 方法(行为)的设计
OC中方法就是行为,主要包括方法名,参数,返回值(声明和实现)方法不能放在大括号里面。只要是OC对象的方法,必须以减号 - 开头,类方法以+开头。OC方法中任何数据类型都必须要用()扩住。OC方法中的小括号():只有一个作用,用来扩住数据类型。
3. 类的声明跟实现
OC中类的声明值得是用来声明对象的属性跟行为,声明对象的属性(实例变量或者叫成员变量) , 成员变量默认情况下会做一个初始化,所有成员变量默认都是0。
声明在@interface和@end之间进行,实现在@implementation和@end之间进行。
简单OC类的实现举例:
#import <Foundation/Foundation.h> // 因为使用了NSObject
@interface Plane: NSObject // NSObject目的是:让这个类具备创建对象的能力
{
@public // @public关键字,可以让外部的指针间接访问内部的成员变量
int wheels;
int speed;
// 大括号里面只能写属性不能写行为
}
- (void)run; // 跑这个方法
@end
//类的实现 用来实现@interface中声明的方法
@implementation Plane
- (void)run
{
NSLog(@"Plane is flying !"); // 实现声明的方法
}
@end
int main()
{
//[Plane new];会创建出一个新对象,并且会返回新对象本身(新对象的地址)
Plane *p = [Plane new]; // 定义了一个指针变量p,p将来指向的是Plane类型的对象
Plane *p2 = [Plane new]; // [Plane new]每次都会创建出一个新的对象
p->wheels = 3; // 给p所指向的wheels属性赋值,类似于结构体
p->speed = 1550;
// 给p所指向的对象发送一条run消息,消息机制:给指针所指向的对象发送一条run消息
[p run];
[p2 run];
NSLog(@"Plane有%d个轮子,时速为%dkm/h",p->wheels,p->speed);
return 0; // 程序退出后会默认把内存回收
}
[Plane new]在使用类创建对象之前,会将类加载进内存,类的内存里面只放方法列表,创建的每个对象内部默认有一个指针(isa指针),这个指针指向这个对象所对应的类,所有的对象共用相同的类里面的方法。
OC 类的成员变量不能在{}中进行初始化、不能被直接拿出去访问;方法不能当做函数一样调用;成员变量\方法不能用static等关键字修饰,别跟C语言混在一起(暂时忽略);类的实现可用写在main函数的后面,主要在声明后面就行了。
4.OC方法的声明和实现
@interface JiSuanQi : NSObject
- (double)pi; // 方法名叫pi,不带参数的方法
// OC方法中,一个参数对应一个冒号
// 方法名叫square: ,要连上冒号,为了防止方法名的冲突,冒号也是方法名的一部分
- (int)square:(int)num; // 带一个参数的方法
// 方法名叫: sumWithNum1:andNum2:
- (int)sumWithNum1:(int)num1 andNum2:(int)num2; // 带两个参数的方法,可读性好 冒号前面加一些描述信息,来描述后面的参数是干嘛用的
@end
5.示例OC的方法
// 设计一个方法,用来和其他车比较车速,返回车速的差距
#import <Foundation/Foundation.h>
@interface Car : NSObject // 类的声明
{
@public
int speed; // 车速
}
// 此处传递一个车进来比较速度,车是一个对象,OC中的对象都是指针类型的,数据类型为Car*
- (int)compareSpeedWithOther:(Car *)other;
@end
@implementation Car // 类的实现
- (int)compareSpeedWithOther:(Car *)other
{
// speed当前这辆车的速度
// other->speed 是other传进来比较的这辆车的速度
// 返回当前这辆车和other这辆车的速度差距
return speed - other->speed;
}
@end
int main()
{
Car *c1 = [Car new]; // 创建车对象c1
c1->speed = 300; // 给对象的speed属性赋值
Car *c2 = [Car new]; // 创建对象c2
c2->speed = 280;
int a = [c2 compareSpeedWithOther:c1]; // c2调用方法并传入c1参数进行速度比较
NSLog(@"%d",a); // 打印速度差距
return 0;
}