A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

1,OC在C基础之上

    1),增加了面向对象的语法

    2),将C语言中复杂的繁琐的语法封装的更为简单


2,更为简单

    1),#import指令
        同一个文件 无论#import多少次 最终只会包含一次 不会出现重复包含

    2),NSLog()函数
        a,自动换行
        b,会输出一些其他的调试信息

    3),NSString
        a,OC字符串常量和C字符串常量区别:OC的前面有@
        b,NSString 只能存储OC字符串常量
            NSString *str = @“jack”

    4),数据类型
        BOOL : YES  NO
        Boolean : true false
        class id nil SEL block类型


3,面向对象的语法

    1),面向过程,面向对象的理解

    2),面向对象最大的优点: 极大的提升可维护性。

    3),类与对象 及其之间的关系

    4),设计类的三要素 a,类名(名词提炼法)     b,特征    c,行为


4,类与对象

    1),如何去定义一个类
        a,位置    b,语法    c,使用

    2),方法的声明和实现
        a,声明和实现的位置      b,实现的语法     c,方法命名规范


5,对象的创建与访问

    类名 *对象名= [类名 new];

    对象的特点:又有类定义中所有的成员
        对象中的成员可以直接访问。

    对象名->属性  (*对象名)属性
    [对象名 方法名] [对象名 方法名 :实参]


6,同一个类可以创建无数个对象 并且对象两两之间毫无关系

    在方法中直接访问属性,访问的就是当前对象的属性。



1,内存中的五大区域

    栈:局部变量
    堆:程序猿手动申请的内存空间 malloc calloc realloc 函数分配的。
    BSS段:存储未被初始化的全局变量,静态变量
    数据段:存储已经被初始化的全局变量,静态变量,常量   
    代码段:存储代码


2,类加载

    1),在创建对象的时候,肯定是需要访问类的

    2),声明一个类的指针变量的时候,也是需要访问类的
        在程序运行期间,当某个类第一次被访问的时候,就会将这个类存储到内存中的代码段中去
        这个过程叫做类加载。

        只有类在第一次被访问的时候,才会被加载,所以类只会被加载一次
        一旦类被加载到代码段以后,直到程序结束的时候才会被释放。


3,对象在内存中究竟是如何存储的?

    假设下面的代码写在函数之中
    Person *p1 = [Person new];

    1),Person *p1;
        声明了一个Person 类型的指针变量 是局部变量
        会在栈内存中申请一块空间,在栈内存中声明一个Person类型的指针变量叫做p1。
        p1是一个指针变量,只能存储地址。存储的是堆中的存储对象的地址。

    2),[Person new] 真正创建对象的其实是这句代码
        new做的事情
        a,在堆内存中申请一块合适的大小的空间
        b,在空间中根据类的模版创建对象
            看类模块中定义了什么属性,就把属性依次声明在对象当中
            对象中还有另外一个属性 叫做isa 是一个指针。
            这个指针指向对象所属的类在代码段中的地址
        c,初始化对象的属性
            如果属性的类型是基本数据类型 赋值为0
            如果属性类型是C语言的指针类型 那么赋值为NULL
            如果属性类型是OC语言的类指针类型 那么就赋值为nil
        d,返回对象的地址

    3),注意

        a,对象中只有属性,没有方法。自己的属性外加一个isa指针指向代码段中的类
        b,如何访问对象的属性
            指针名->属性名
            根据指针 找到指针指向的对象,再找到对象中的属性进行访问
        c,如何调用方法[指针名 方法名]
            根据指针名 找到对象 对象发现腰调用方法,跟根据对象的isa指针找到类,
            然后调用类中的方法。


4,为什么不把方法存储在对象之中?

    每个对象的属性是没有关联的,是不一样的 ,但是方法都是一样的。
    没必要都为对象保存,这样太浪费空间了


5,对象的属性的默认值问题

    如果我们创建一个对象 没有为对象的属性赋值
    那么这个对象的属性是有值的 默认值
    如果属性的类型是基本数据类型 赋值为0
    如果属性类型是C语言的指针类型 那么赋值为NULL
    如果属性类型是OC语言的类指针类型 那么就赋值为nil




1 个回复

倒序浏览
1,NULL

    可以作为指针变量的值如果1个指针变量的值时NULL 代表这个指针不指向任何内存空间
    NULL其实等价于0 NULL其实是一个宏 就是0


2,nil

    只能作为指针变量的值,代表着指针不指向内存红枣南瓜的任何空间
    nil其实也等价于0 也是一个宏 就是0

    所以,NULL和nil其实是一样的


3,使用建议

    虽然语法上都一样,可以互换,但是不建议乱用
    规范:
    C的指针用NULL;
        int *p = NULL; p1指针不指向任何内存中的空间
    OC的类指针用nil;
        Person *p1 = nil; p1指针不指向任何对象


4,如果一个类指针的值为nil,代表这个指针不指向任何对象
    Person *p1 = nil;

    那么这个时候,如果通过p1指针去访问p1指针指向的对象的属性,这个时候就会运行报错。
    如果通过p1指针去访问p1指针指向的对象的方法,这个时候运行不会报错,但是方法不会去执行,没有反应。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马