《Objective-c》-(面向对象:类)
一、面向对象和面向过程的区别
以将大象装进冰箱为例:
-
面向过程:
1.打开冰箱门
2.将大象装进去
3.将冰箱门关上
-
面向对象
冰箱
1.开门
2.装东西(大象)
3.关门
总结:
- 面向过程关注的是结局问题需要哪些步骤;
- 面向对象关注的是解决问题需要哪些对象;
二、类
-
面向对象中两个很关键的概念:类和对象
1.创建对象
创建对象需要现有类(建造图纸),图纸上表述清楚了对象应该具备的属性和功能(行为)
2.创建类
事物名称(类名):人(Person)
属性:身高(height)、年龄(age)等
行为(功能):跑(run)、吃(eat)
注:
1.一般名词都是类
2.拥有相同(或者相似)属性和行为的对象都可以抽象出来一个类
3.类名的第一个字母必须大写;
4.不能有下划线,如果有多个英文单词组成,用驼峰标示
5.那个行为哪个类最清楚,就把这个行为设计到那个对象里
3.类的声明和实现
- 完整的写一个类/函数,需要两个步骤,类的声明和实现(定义)
-
类的声明:
@interface 类名
例:
@interface Car
{
// 这里声明对象的属性
}
// 这里声明一些行为(方法)
@end
-
类的实现:
@implementation 类名
// 这里是一些方法的实现
@end
例:
@implementation Car
// 方法的实现
@end
-
利用类创建对象
Car *c = [Car new];
注:
1.OC中只能用指针变量间接来操作对象;
2.定义了一个指针变量c,c将来指向的是Car类型的对象
3.[Car new];会创建出来一个新的对象,并且会返回新对象本身(新对象的地址)
-
第一个OC的类
/* 类名:Car 属性:轮胎数量、时速 行为:跑 完整的写一个函数:函数声明和定义(实现) 完整的写一个类:类的声明和实现 */ // 因为下面使用了NSObject #import <Foundation/Foundation.h> // 1.类的声明 // 用来声明对象的属性和行为 // :NSObject 目的是:让Car这个类具备创建对象的能力 @interface Car : NSObject { // 大括号内用来声明对象属性(实例变量/成员变量,默认会初始化为0) // @public可以让外部的指针间接访问对象内部的成员变量 @public int wheels; // 轮胎个数 int speed; // 时速 } // 方法(行为):方法名、参数、返回值 // 只要是OC对象的方法,必须是以减号开头 - 开头 // OC方法中任何数据类型都必须用小括号()扩住 // OC方法中的小括号就一个作用:扩住数据类型 // - (void)run(); // 错误 - (void)run; @end // 2.类的实现 @implementation Car // 方法的实现(说清楚方法里面的具体代码) - (void)run { NSLog(@"车子跑起来了"); } @end int main() { // 在OC中,想执行一些行为,就写上一个中括号 [行为执行者 行为名称] // 利用类来创建对象 // 执行了Car这个类的New行为来创建一个对象 // 定义了一个指针变量p,p将来指向Car类型的对象 // [Car new]会创建出一个新对象,并且会返回新对象本身(新对象的存储地址) Car *p = [Car new]; p -> wheels = 4; // 访问成员变量 p -> speed = 120; // 访问成员变量 Car *p2 = [Car new]; // 这里又创建了一个对象 p2 -> wheels = 5; // 访问成员变量 p2 -> speed = 230; // 访问成员变量 NSLog(@"车子有%d个轮子,时速为:%dkm/h", p -> wheels, p -> speed); NSLog(@"车子有%d个轮子,时速为:%dkm/h", p2 -> wheels, p2 -> speed); // 给p所指向的对象发送一个run消息,(OC中的消息机制) [行为执行者 行为名称]; [p run]; return 0; }
-
第二个OC的类
/* 类名:Person 属性:(成员变量/实例变量)体重、年龄 行为:(方法)走路 */ #import <Foundation/Foundation.h> // 1.类的声明 // *成员变量 // *方法的声明 @interface Person : NSObject { @public int age; double weight; } - (void)walk; @end // 2.类的实现 // *方法的实现 @implementation Person - (void)walk { NSLog(@"年龄为%d、体重为%f的人跑起来了", age, weight); // 谁调用这个walk方法,这里的age、weight就代表是谁的age、weight } @end int main() { // 在使用类创建对象之前,会先讲类加载进内存,并且只会加载一次,类中保存着方法列表 // 创建出的每一个对象内部都默认存在一个isa指针,指向其类 Person *p = [Person new]; p -> age = 20; p -> weight = 50.3; [p walk]; // 当对象调用方法是,就会顺着该对象内部的isa指针找到类并执行类中相应的方法 Person *p2 = [Person new]; p2 -> age = 24; p2 -> weight = 60.5; [p2 walk]; return 0; }
-
对象的简单内存分析
Person *p = [Person new];
注:
1.在使用类创建对象之前,会将类加载进内存,并且只会加载一次
2.每个对象内部都默认拥有一个isa指针,并且这个isa指针指向所对应的类;
3.成员变量是每个对象都有的,方法是公共的。
三、常见错误及注意点
#import <Foundation/Foundation.h> /* 注意点1:@interface....@end 和 @implementation....@end不允许嵌套使用 注意点2:@interface...@end(类的声明)必须写在创建该类([Car new])之前 */ @interface Car : NSObject { /* 注意点3:成员变量必须写在@interface后面的大括号内 注意点4:不允许在@interface里面对成员变量进行初始化 注意点5:不能随便将成员变量当做C语言中变量使用,如:不能用static修饰 */ int wheels; int speed; } // 注意点6:方法的声明必须写在@interface中,并且必须写在大括号外面、 // 注意点7:不能讲OC中的方法当做C语言中的函数来使用,如:不能用static修饰 - (void)run; @end @implementation Car // 注意点8:方法的实现必须写在@implementation中 - (void)run { NSLog(@"轮子为%d、速度为%d的车子跑起来了", wheels, speed); } @end int main() { // 注意点9:只有创建了对象后才能使用成员变量 // wheels = 4; return 0; } /* 注意点10:方法和函数的区别 方法: 1.对象方法都是以减号 - 开头 2.对象方法的声明必须写在@interface和@end之间 对象方法的实现必须写在@implementation和@end之间 3.对象方法只能由对象调用 4.对象方法归类/对象所有 函数: 1.函数能写在文件中任意位置,函数归文件所有 2.函数调用不依赖对象 3.函数内部不能通过成员变量名直接访问对象的成员变量 */