Objective-C之类和对象(1)
一概述:
1.类-统称:
类是对一群具有相同特征或者行为的事物的一个统称,抽象的,不能直接使用的,如果使用类的话,只能去类中找到类的具体存在,也就是对象,然后使用。
2.对象-具体:
对象是现实生活中一个具体对存在,看得见,摸得着,拿过来就可以直接使用.
例如:学生就是个类,学生有姓名、学号、身高等特征,也有上学、读书等行为。根据学生类,我可以实例化出(或具体存在)一个叫 李华 的学生对象,它有学生类中的所有特征,也有学生类 的行为.
二.类:
类的设计只关注三个东西:
1.类名
2.属性:属性是 成员变量 的API(对外接口),
3.方法:行为
注意:
1.把拥有相同属性和行为的对象都可以抽象为一个类,类名 是标识符的一种,需要符合规范,类名首字母一般大写,而且不能有下划线,如果有多个单词则使用驼峰标识。
2.在对方法进行累的划分中,一般采取的做法是谁最熟悉这个方法那么就把这个方法划分给谁.
3.在OC中,对象对方法的调用称为 消息机制,向指定的对象发送什么消息。
三.在OC中定义一个类需要两个文件.h和.m:
每个类的定义包括两个部分:接口(interface)和 实现(implementation)。
接口部分定义在.h文件中,包含类的声明、属性以及方法,主要作用是对外提供访问接口。
实现部分定义在.m文件中,主要用于方法的功能实现。
这种定义类的方法,好处在于将公共声明(接口)与代码实现分开,对外屏蔽了功能实现的细节,体现了面向对象的封装特性
创建一个学生类:
关键字@interface声明一个类,同时它必须以@end结束;
在这两个关键字中间声明相关成员;
在声明Student类的同时可以看到它继承于NSObject(继承用 : 来表示),这是OC的基类,所有的类最终都继承于这个类,由于NSObject这个类在Foundation框架中定义的,所以要导入Foundation框架。
关键字@implementation用于实现某个类,同时必须以@end结尾;
在这两个关键字中间实现具体的属性、方法;
由于.m中要实现Student声明,所以需要导入声明文件“Student.h”;
成员变量(实例变量)与方法:
成员变量:定义在.h文件中,同时必须定义在类后面的{}内。成员的可访问性通过下面三个关键字声明:
@private 私有成员,只有当前类可以访问;
@protected 受保护成员,只有当前类或子类可以访问(如果没有添加任何修饰则默认为@protected);
@public 公共成员,所有类均可访问;方法:在OC中方法分为静态方法和动态方法两种,动态方法就是对象的方法,静态方法就是类方法,这一点跟其他高级语言没有区别。
在OC中使用“-”定义动态方法,使用“+”定义静态方法。
如果一个方法在.h中有声明则该方法是公共方法,如果没有在.h中声明直接在.m中定义则该方法是私有方法,外部无法访问。
实例化:
这里需要注意几点:
1.OC中所有的对象类型的变量都必须加上“*”,在OC中对象其实就是一个指针(例如之前看到的NSString也是如此,但是基本类型不用加”*”);
Student *stu;会在栈内存中申请一块空间,声明1一个student类型的指针变量stu。
stu是个指针变量,存储的是【【student alloc】init】在堆内存中开辟内存空间的地址。
stu指针指向的变量中,也就是对象,存储了一个叫isa,也是一个指针,指向对象所属的 类对象地址.
2.OC中使用[]进行方法调用,在OC中方法调用的本质就是给这个对象或类发送一个消息;
stu对象,有个isa 指针以及stu成员变量,而动态方法以及静态方法不在这存储在其他地方,刚刚说了对象有个isa指针,它指向类对象,类对象存储对象的属性、方法等等信息,类对象也有isa指针,指向的是student 元类,元类存储着类方法等等信息。
先根据指针名找到对象,对象发现要调用方法,在根据对象的isa指针找到类对象。看看要调用是静态还是动态方法,如果是静态,就再根据类对象的isa指针去找,如果是动态,就直接调用类对象里的对象方法。
3.在OC中类的实例化需要两个步骤:分配内存、初始化;
4.类的初始化调用了父类的init方法,也可以在子类重写父类init的方法,如果使用默认初始化方法进行初始化(没有参数),内存分配和初始化可以简写成[Student new];
初始化对象的属性,给对象的属性赋默认值。
如果属性的类型是基本数据类型,那么就赋值为0
如果属性的类型是c语言的指针类型,那么就赋值为NULL
如果属性的类型为OC语言的类指针类型,那么就赋值为nil
** nil与NULL的区别
NULL 可以作为指针变量的值,如果一个指针变量的值是NULL值代表这个指针不指向内存中的任何一块空间,其实等价于0。NULL其实是一个宏,就是0。
nil 只能作为指针变量的值,代表这个指针变量不指向内存中任何空间。nil其实也等价于0,也是一个宏,就是0。
所以NULL和nil其实是一样的,虽然使用NULL的地方可以使用nil,但是不建议随意使用。C指针用NULL ,OC的类指针用nil。
Student *stu = nil;表示stu指针不指向任何对象。
如果一个指针的值为nil代表这个指针不指向任何对象,
此时如果通过stu指针去访问stu指针指向的对象的属性,运行就会报错。
如果通过stu指针去调用对象的方法,运行不会报错,但是方法不会执行。
5.公共成员的调用使用“->”操作符;