OC基础DAY02 - 类与对象

来源:互联网 发布:kerasys洗发水知乎 编辑:程序博客网 时间:2024/05/21 17:17

    • 对象在内存中的存储
        • 类加载
          • 对象在内存中是如何存储的
      • nil是什么
        • 多个指针指向同一个对象
          • 分组导航标记
  • pragma mark - 标记名
  • warning 写到这里了 可以标记一个警报标记问题或者昨天写到哪里了
        • 方法与函数
        • 都是你的错
        • 对象作为方法的返回值
        • 对象作为类的属性
      • 猜拳游戏
          • 面向对象的思维去写一个猜拳

对象在内存中的存储

类加载

  1. 当我们访问类的时候,肯定需要访问这个类,因为只有访问了类才知道类中有哪些成员
  2. 如果只是声明指针的时候,也会访问这个类,以确定是否存在.
  3. 当类第一次被访问的时候,会将类存储到代码段之中.这个过程叫做类加载.以字符串的形式保存在代码段中.
  4. 只有类第一次被加载的时候才会去加载,直到程序结束才会被回收.
对象在内存中是如何存储的
  1. 类的本质是:我们自定义的数据类型
HMPerson *p1 = [HMPerson new]
  1. HMPerson* p1; 1.这句话仅仅是声明了一个指针变量而已,类型是HMPerson * 类型

    2.p1变量是声明在栈区的局部变量.所以这个变量当中只能存储地址
    3.本质上p1是一个指针变量不是一个对象

  2. [HMPerson new]
    - 这句话,才是真正的创建对象.new做的事情
    1. 现在堆内存中申请一块合适大小的空间
    2. 在申请的空间中根据类的模板来创建对象.

      > >类中有哪些属性,就在这个空间当中声明哪些属性.还有一个属性叫isa,是一个指针.
      > >这个isa指针指向代码段当中的类.
      > >

    3. 初始化对象的属性的值,为这个代码的属性赋默认值.

      > >OC指针赋nil
      > >基本数据类型赋0
      > >C语言指针赋NULL
      > >

    4. 返回对象在堆空间当中的地址.

      • 注意
    5. 指针->isa可以找到这个指针,但无权访问
    6. 通过指针就可以找到指针指向的对象,就可以找到对象的属性(在堆区)
    7. 通过p1指针知道对象,发现是在调用方法,再根据isa指针找到代码段中的类,再找到类当中对应的方法来执行.
    8. 不管对象有多少个,方法的代码都是一样的,只保存一份就可以了.所以方法保存在代码段的类当中.
    9. 相同类的对象的isa指针的值一定都是一样的.
    10. 我们创建对象的第三步,就会为对象的属性赋初始值.对象属性是有初始值的.0,nil,NULL.

nil是什么��

  1. NULL是C语言中指针的值,代表不指向任何空间.NULL本质上是宏 ((void*)0),而且是个指针,跟0等价.内存上没有0这个空间.
  2. nil
    1. 他也是一个指针变量的值
    2. 其实nil也是一个宏��. __DARWIN_NULL ((void *)0)
    3. 如果你想让一个指针不指向任何空间,NULL,nil,0都可以.
    4. 使用建议.
    5. nil是OC指针专用
    6. NULL是C指针专用
    7. 注意的一个问题
    8. 如果一个类指针的值为nil,代表p1指针不指向任何对象,这个时候你通过p1指针去访问p1指向的对象的属性的时候肯定汇报错.
    9. 通过p1去调用sayHi方法的时候,(内存中已经加载)不会报错也不会崩溃,没有任何反应.

多个指针指向同一个对象

  1. 类型相同的OC类指针变量之间是可以相互赋值的.
HMPerson *p1 = [HMPerson new]HMPerson *p2 = p1;1. 这个时候p1和p2指针指向了同一个对象.2. 无论通过p1还是p2去访问或修改都是同一个对象.HMPerson *p3;p3 = [HMPerson new];完全可以没差别.
  1. 凡事你看到了new 就代表重新创建了一个对象
[类名 new];就代表新创建了1个对象.1. 其实这时在调用了一个方法2. 中括号代表方法.3. new方法的功能是创建对象,返回值是:创建的对象的地址.
分组导航标记

pragma mark - 标记名

warning !!!!!写到这里了 可以标记一个警报,标记问题或者昨天写到哪里了.

方法与函数

  1. 之前在C语言中学习的叫做函数,OC类中定义的叫做方法.
  2. 相同点
    1. 都封装一段代码.表示一个相对独立的功能.
    2. 不调用,里面的代码是不会被执行的.
    3. 不同的
    4. 语法不一样
    5. 定义的位子不一样.
      2.1 函数除了函数内部以及@interface的大括弧中,其他地方都可以定义.
      2.2 方法的声明只能在@interface的大括号外,是现在@implementation下面
      2.3 就算你把函数写在类中,这个函数也不属于这个类.
    6. 函数就像没有加的孩子,相互孤立的.方法是属于类的,类就是方法的家.
    7. 调用形式不同,函数直接调用,方法必须通过对象名调用

都是你的错��

  1. @interface是类的声明 @implementation 是类的实现,他们相互独立是不能嵌套的.
  2. 类的声明和实现都要有.

对象作为方法的返回值

- (HMDog *)buyDog;//这样写方法,就会返回一个HMDog*类型的对象.{    //实现    HMDog *xh = [HMDog new];    xh->_name = @"阿黄";    xh->_colour = @"白色";    return xh;}
  1. 返回值应该写类指针类型的,代表方法执行完毕有一个HMDog对象返回.方法结束前必须使用return xh;返回一个符合类型的对象.
  2. 调用
HMDog *dog = [xiaoMing buyDog];这样就可以了,xiaoMing 是买狗方法的拥有类的对象

本质上来说其实返回的是一个指定对象的地址,不用担心被销毁,==因为对象是存储在堆区的==

对象作为类的属性

@interface HMPerson : NSObject{    @public    HMDog *_dog;}@endHMPerson *p1 = [HMPerson new];1. 这句代码执行先加载类到代码段2. 在堆中再创建对象.NSString*,HMDog*都是指针,没有创建字符串和对象,而是声明一个指针变量初始化位nil.3. 在模板中属性是什么类型创建对象就创建什么类型.调用HMDog wangCai = [HMDog new];p1->_dog = wangCai;[p1->_dog shout];对象的属性是一个类的对象,并没有产生对象,这个时候还要为这个属性赋值一个对象的地址才可以正常使用

猜拳游戏

面向对象的思维去写一个猜拳
  1. 分析有哪几个类(玩家,机器人,裁判)
  2. 分析有哪些属性(姓名,得分,出的拳头)
  3. 拳头的类型是固定的三种,用枚举.
  4. 玩家和机器人都要用,所以枚举单独定义到一个头文件里面.h
  5. 玩家有一个方法是接收用户选择的出拳.接收的拳要保存到玩家的属性中以免方法结束就销毁了.
  6. 在类方法中调用当前对象的另一个方法
[self 方法名];self代表当前对象.
  1. 机器人转换字符串的时候可以调用玩家的这个功能,也可以自己带这个功能.但是调用玩家的会很麻烦降低性能.我们认为最好是使用自己的这个功能.
  2. 裁判裁决输赢的方法设置玩家和机器人两个参数,方便拿到玩家和机器人的属性中的参数.
  3. 用枚举类型创建两个新的局部变量在方法中去接收玩家和机器人的拳头类型.
  4. 转换成while循环.创建对象部分放在循环外,调用方法在循环内.
0 0
原创粉丝点击