OC基础-id+构造方法+自定义构造方法+分类Category

来源:互联网 发布:一个月淘宝可以退货吗 编辑:程序博客网 时间:2024/05/21 07:56
<1>id类型
1. 是一个万能指针,可以指向/操作任何一个OC对象
2. id类型的变量本身就是一个指针类型


<2>构造方法
1. new方法的实现实际上是分为两步的,1.分配存储空间,调用+alloc方法;2.初始化,调用-init方法
  1>调用+alloc方法
    Person *p1 = [Person alloc];
  2>Person *p2 = [p1 init];
    但可以写成下面的一句(以后会经常这样写,中括号套一个中括号,而且new就不常用了)

  Person *p = [[Person alloc] init];  // 这个init就是构造方法

  构造方法: 用来初始化对象的方法,是一个对象方法

  (在需要的类中)重写-init方法:  - (id)init****    //有固定的格式,如下:
  // 1.一定要先调用回super的init方法:初始化父类中声明的一些成员变量和其他属性
        self = [super init];     // 当前对象 self

  // 2.如果初始化成功,才有必要进行接下来的初始化
        if(self != nil){  // 初始化成功
         _age = 10;
     }

  // 3.返回一个已经初始化完毕的对象
        return self;

  可以进一步压缩代码长度
        if(self = [super init]){
         _age = 10;
     }
     return self;

  这时候调用这个重写后的init方法,每个新创建的对象的 _age 都是 10。
  重写构造方法的目的:为了让对象被创建出来的时候,它的成员变量就会有一些固定的值

2. 重写构造方法的注意点:
  1>先调用父类的构造方法([super init])
  2>再进行子类内部成员变量的初始化

3. 如果子类和父类有相同的方法,优先调用子类的方法,这时又会调用父类的init([super init]吗,一级一级往上调,一直调到NSObject根类为止),然后再一级一级的回到原始地方,[有点像递归]     [基础0808-构造方法1------35:35——39:20以及构造方法2的前10分半钟]

4. 可以使用Xcode的断点功能来跟踪程序流程

5. 成员变量统统以下划线开头


<3>自定义构造方法
1. 自定义构造方法的规范:
  1>一定是对象方法
  2>返回值一般是id类型
  3>方法名一般以initWith开头

2. 哪个类的属性就交给哪个类的方法来实现,各管各的,不要插手别人的事,面向对象的思想


<4>分类(OC特有的语法) Category:分类,类别,类目
1. 分类的作用:可以给某一个类扩充一些方法(在不修改原来类的代码文件,不建立继承关系的前提下)另建一个文件(类),如果要用到这个类里的方法,就要包含该类的头文件,格式:
    //声明
    @interface 被扩充的类的类名 (分类名称)
    @end
    //实现
    @implementation 被扩充的类的类名 (分类名称)
    @end

2. 分类的文件名就是”被扩充类的类名+分类名称.h”    ”被扩充类的类名+分类名称.m”

3. 使用注意
    1>分类只能增加方法,不能增加成员变量
    2>分类的方法实现中可以访问原来类中声明的成员变量
    3>分类可以重新实现被扩充类中的方法,但是会覆盖掉原来类中的方法,会导致原来的方法没法再使用
    4>方法调用的优先级:分类 —-> 被扩充类 —-> 父类
    5>如果两个分类中有相同的方法,使用谁,取决于最后编译谁(跟编译顺序有关,这个可以在Xcode中查看)

4. 编译只编译源文件 .m/.c   .h文件是不编译的

5. 给系统自带的类添加分类,因为开发中系统自带的类不能满足我们的需求
    .这里的一个例子是计算一个字符串中有几个数字,所以要建立NSString类的一个分类,特别的再记录一下,字符串本身也是一个对象

6. 网上有很多的开源的类库,这些类都是一些写好的针对不同需求的分类









0 0
原创粉丝点击