在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
一概述: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]; 初始化对象的属性,给对象的属性赋默认值。 如果属性的类型为OC语言的类指针类型,那么就赋值为nil ** nil与NULL的区别 如果一个指针的值为nil代表这个指针不指向任何对象, 此时如果通过stu指针去访问stu指针指向的对象的属性,运行就会报错。 如果通过stu指针去调用对象的方法,运行不会报错,但是方法不会执行。 5.公共成员的调用使用“->”操作符; |
请发表评论