一、类和对象的关系
面向对象中有2个非常重要的概念:类和对象
1. 如何创建对象
1) 面向对象解决问题的时候必须有对象,那如何创建对象呢?
2) 现实生活的例子:如何创造汽车对象?
a) 需要先有汽车的建造图纸,图纸上描述清楚汽车应该具备的属性和功能(行为)
Ø 属性:轮子数、时速
Ø 功能(行为):跑
b) 然后再根据图纸上的描述生成汽车
c) 每一辆汽车都是对象,都有自己具体的属性值,都是图纸的实例
d) 图纸是抽象的,房子是具体的。图纸是对房子对象的高度概括
2. OC中的面相对象
1) OC中的类相当于图纸,用来描述一类事物。也就是说,要想创建对象,必须先有类
2) OC利用类来创建对象,对象是类的具体存在
3) 因此,面向对象解决问题应该是先考虑需要设计哪些类,再利用类创建多少个对象
3. 需要设计哪些类,如何设计类
1) 类的设计,只关心3样东西:
Ø 事物名称(类名):
Ø 属性:
Ø 行为(功能):
2) 一般名词都是类
3) 拥有相同(或者类似)属性和行为的对象都可以抽像出一个类
二、定义OC的类和创建OC的对象
类的声明一般采用如下形式:
1. 类的声明
1) 代码编写
Ø 定义一个Car类,拥有2个属性:轮子数、时速,1个行为:跑
Ø 类名\属性的命名规则:标示符的规则
Ø 类名的命名规范:有意义、驼峰标识、首字母大写
#import <Foundation/Foundation.h>
// 类的声明
@interface Car : NSObject
{
@public
int wheels; // 多少个轮子
int speed; // 时速
}
- (void)run; // 跑的行为
@end
2) 成员变量
Ø @interface的大括号{}中声明的变量:wheels、speed
Ø @interface的大括号和函数的大括号是不一样的
Ø 默认会初始化为0
3) @public
@public可以让Car对象的wheels和speed属性被外界访问
4) NSObject
加上:NSObject的目的是让Car类具备创建对象的能力
2. 类的实现
// 类的实现
@implementation Car
- (void) run
{
NSLog(@"%i个轮子,%i时速的车子跑起来了", wheels, speed);
}
@end
3. 创建对象
1) 代码编写
// 主函数
int main()
{
// 创建车子对象
Car*c = [Car new];
c->wheels = 3;
c->speed = 300;
[crun];
return 0;
}
2) main函数的代码分析、内存分析(对象在内存中有成员)
Ø [Car new]每次都会创建出新的对象,并且返回对象的地址,那么就应该用一个指针变量保存对象的地址
Car *c = [Car new];
用一个指针变量c指向内存中的Car对象
Ø 设置车子对象的属性
跟用指向结构体的指针访问结构体属性一样,用->
c->wheels = 3;
c->speed = 300;
4. 创建多个Car对象
Ø 分别只设置wheels、speed属性
Car *c1 = [Car new];
c1->wheels = 4;
Car *c2 = [Car new];
c2->speed = 250;
[c1 run];
Ø 1个赋值给另一个,然后修改属性
Car *c1 = [Car new];
c1->wheels = 4;
c1->speed = 250;
Car *c2 = c1;
c2->wheels = 3;
[c1 run];
三、类方法
1. 基本概念
直接可以用类名来执行的方法(类本身会在内存中占据存储空间,里面有类\对象方法列表)
2. 类方法和对象方法对比
1) 对象方法
Ø 以减号-开头
Ø 只能让对象调用,没有对象,这个方法根本不可能被执行
Ø 对象方法能访问实例变量(成员变量)
2) 类方法
Ø 以加号+开头
Ø 只能用类名调用,对象不能调用
Ø 类方法中不能访问实例变量(成员变量)
Ø 使用场合:当不需要访问成员变量的时候,尽量用类方法
3) 类方法和对象方法可以同名
4) 类方法的好处
Ø 不依赖于对象,执行效率高
Ø 能用类方法,尽量使用类方法
Ø 场合:当方法内部不需要使用到成员变量时,就可以改为类方法
5) 工具类:基本没有任何成员变量,里面的方法都是类方法
#import<Foundation / Foundation.h>
@interfacePerson : NSObject
-(void)test;
+(void)test;
@end
@implementationPerson
-(void)test
{
NSLog(@"对象方法\n");
[Person test];
}
+ (void)test
{
NSLog(@"类方法");
}
@end
int main()
{
Person *p = [Person new];
[p test];
return 0;
}
输出结果:对象方法
类方法
四、self关键字
1. 成员变量和局部变量同名
Ø 当成员变量和局部变量同名时,采取就近原则,访问的是局部变量
Ø 用self访问成员变量,区分同名的局部变量
2. 使用细节
1) 出现的地方:所有的OC方法中(对象方法\类方法),不能出现在函数
2) 作用
Ø 使用 "self->成员变量名" 访问当前方法调用的成员变量
Ø 使用 "[self 方法名];" 来调用方法(对象方法\类方法)