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.公共成员的调用使用“->”操作符;





猜你喜欢

转载自blog.csdn.net/null959_/article/details/80950894