ObjC-7 类目、协议

类目、协议(协议是重点)、延展、
有可能的面试题: 
怎样扩展一个类,为类添加方法?
  • 1. 修改类源代码
  • 2. 编写此类的子类
  • 3. 类目(分类)(Category)文件名形如:NSString+CSayHi
  • 4. 延展 (Extension)
  • 5. 协议 (Protocal)
      
    一、关于类目
    1、类目特点
    • 类目也称为分类、类别
    • 可以为已知的类添加方法,哪怕是你没有源码的类
    • 通过类目添加方法会成为原始类的一部分
    • 与原类中的方法同级
    • 会被子类继承
    2、类目的用处
      • 1. 可以扩展别人的类,可以作为子类的替代方式。
      • 2. 把同一个类的代码放到多个文件中;便于多人协作。
    • 注意:
      • 不能在类目中添加 实例变量。可以添加属性@property,因为属性的本质是set、get方法。
      • 可以为同一类添加多个类目,但类目名和方法名不能重复
      • 不要随意重写类目中的方法

    二、关于延展
    1、 延展是一种特殊形式的类目
        编写在类的实现文件中    
    延展Extention形如

    @interface ViewController ()//延展Extention

    把延展的方法写这

    @end

    延展中定义的方法在类本身中实现

    2、延展的作用
     定义私有方法

    三、关于协议。OC虽然没有多继承的功能,但是可以通过实现多协议达到多继承的效果。

    • 协议就是一套标准
      • 协议只声明了方法,不具体实现,接受协议的对象(代理)负责实现
    • OC的协议是由@protocol声明的一组方法列表
      • 要求其它的类去实现,相当于@interface部分的声明


    委托设计模式(代理模式)
    1、@protocol
                         @required
                         @optional

    2、 确认协议:这类似多继承的功能
    @interface 类名:父类名< 协议名一,协议名二...>(OC虽然没有多继承的功能,但是可以通过实现多协议达到多继承的效果。

     @end


    3、协议可以专门创建一个 Protocol 格式的类文档 写协议内容

          协议也可以直接写在调用协议的类的.h文件之中


    4、协议的使用

    (1)创建 Protocol 的类,设置协议内容

    (2)创建代理类-》用 < > 使代理类获得协议内容 -》.m 中实现协议方法

    (3)创建委托类-》声明delegate 属性 “代理”-》声明呼叫代理实现协议的方法-》.m 中实现呼叫方法

    (4)使用代理,                                     

             导入委托、代理类的头文件。   假设:委托、代理类 分别是:WT、DL  , WT的呼叫方法为sent

             实例委托、代理的对象                          WT * wt = [[WT alloc]init];      DL*dl = [[DL alloc] init];

             将dl变成wt的代理                                  wt.delegate = dl;

      有了代理dl后,wt可以呼叫dl履行协议了 [wt  sent];     //其实是让代理去执行协议


    @property (assign/*为什么做协议代理属性时不用内存管理 retain?*/,nonatomic) id<BoosAndSecretary> delegate;//创建代理用来调用协议


    ---拓展知识

    OC中的循环引用问题

    通过对OC语言的学习,我对循环引用的问题这样理解:

          比如在main函数中创建了两个类的对象A和B,现在引用计数都是1。现在让A和B互相引用,现在两个对象的引用计数都增加了1,都变成了2。

          现在执行 [A release]; [B  release]; 此时创建对象的main函数已经释放了自己对对象的所有权,但是此时A和B的引用计数都还是1.因为他们互相引用了。

          这时你发现A和B将无法释放,因为要想释放A必须先释放B,在B的dealloc方法中再释放A。同理,要想释放B必须先释放A,在A的dealloc方法中再释放B。所以这两个对象将一直存在在内存中而不释放。这就是所谓的循环引用的问题。

          要想解决这个问题,一般的方法可以将引用的属性设置为assign,而不是retain来处理。



    category,不可以有私有变量,但是可以有@property的声明,property的声明只是声明了该类的set,get方法(需要引用该category的头文件),但是category实现的m文件里面根本就没有生成这两个方法,所以你使用self.xxx时,会挂掉,错误提示:没有get/set方法。

    你在category的m文件里面@synthesize 也无法声明,

    也就是说,有声明,无实现。

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值