协议和代理模式的概念

回顾:
内存管理:
1.OC中的内存管理,保证堆内存被正确的释放
2.管理的范围:继承了NSObject的对象
3.引用计数器的概念
    引用计数器是用来记录当前对象被引用了多少次,也就说有多人正在使用它。
   当你要使用一个对象的时候,应该让该对象retain,引用计数器+1
   当你不使用某个对象的时候,应该release(autorelease),引用计数器-1。
   只有当“引用计数器”的值为0的时候,系统会自动调用dealloc方法,来回收内存空间。
   dealloc方法,一方面是为了监控当前对象什么时候销毁;另一方面,当前对象之前拥有过其他对象的指针,必须在dealloc方法里release
    [super  dealloc];
    
4.黄金法则
5.自动释放池    


协议
代理 【重点之重】【在iOS开发中一种非常重要的设计模式】

一 协议
   1.1  什么是协议
            协议就是要相互遵守的约定,规范,行为
    
   1.2  OC中的协议
        OC的协议,就是一组方法的列表,不需要自己实现,由遵守协议的对象来实现协议中规定的方法。

    1.3  协议的使用步骤:
          1)制定协议 ——》 2).遵守协议——》3).由遵守协议的对象去实现协议里的方法——>4).调用协议方法

     比如:某公司的老板,需要招聘一批程序员来为他开发项目,那么,老板需要制定一份协议,协议里规定:需要程序员具备写代码,调bug,汇报工作的能力。。。

协议方法的修饰符:
@required     //必须实现,默认
@optional     //可实现,可不实现

    1.5 OC是多继承吗?有什么办法,可以解决这个问题?
            不是,是单继承。
           OC中的协议,可以实现类似于多继承的功能。
 
          OC中的类可以同时遵守多个协议


   1.6 协议的作用:
         1.规范接口,统一接口。让遵守这个协议的所有对象都必须实现一            些方法。
           2.实现类似于C++的多继承的效果
       3.开发中最常用的【代理设计模式】


    1.7 协议和继承都能达到统一接口的目的
            继承:子类继承父类,子类就拥有父类的方法(不需要再实现一遍),除非父类的方法不满足子类的需求,需要重写父类的方法,重写的方法名和父类的方法名一样,这样就达到了统一接口的目的。
            协议: 协议是用来规范接口,统一接口,一旦一个类遵守了协议,那么必须实现协议中规定的方法,如果多个类遵守了同一个协议,那么这些类中的协议方法名一样,这样也达到了统一接口的目的。

      1.8 协议的特点:
            1)所有的协议都必须直接或者间接的遵守基协议<NSObject>
            2)  一个协议可以被多个对象同时遵守
           3)  一个对象可以遵守多个协议
           4) 如果父类遵守了某个协议,那么子类也会继承下去,即子类也                遵守了某个协议
            

练习:
1.现在有多个类,一个是加法类,一个减法类,一个乘法类,一个除法类,需要实现一个类具备加,减,乘,除四个功能。

        
2.创建一个超人,让他既能飞,也能工作,还能敲代码。


    1.8 指针的限定   
    见【Demo】-【2-指针的限定】




二 代理设计模式  【重点】
     代理
     是iOS中一种非常重要的设计模式,是通过协议去实现的。
   
    代理:
     A如果想 去做某一件事,但他自己不会做或者不想做,那么他就会委托B帮他做。
        A委托B:A就是委托者
                              B就是A的代理人

例子:老板Boss想去看电影,老板需要买票,但是老板自己没有时间,委托职员去帮他买票(网络,现场排队,电话买?。。),老板只想知道票价是多少?还剩下多少张?
    
    Boss:
        @property( …) Staff *sta;
        -(void)想看电影。{
            [sta  买票。。。];    
    }
}

  Staff:
        -(void)买票;

A委托B  A让B帮忙做事
A:委托者    1)制定协议
                   2)声明协议指针,指针所指向的对象必须是遵守了                                该协议的对象 id<协议名>  delegate;
                        3)    A让代理人B去做事,即使用self. delegate 调用                                协议方法

B:代理者 1)遵守A制定的协议
                        2)实现协议里规定方法(这样,认为B具备了帮A                                做事的能力)



三  循环包含和循环引用
     3.1 循环包含
           A的头文件导入了B的头文件,同时B的头文件又导入了A的头文件,这样,在展开头文件的时候,就会无限循环展开,这个过程称为“循环包含”.

            解决方案:
            #import 只能解决头文件重复包含的问题,但解决不了头文件循环包含。
            使用@class解决头文件循环包含的问题!
            @class 表示的是一个类的前置声明(预声明)
            @class  Staff;    仅仅只告诉当前类,Staff是一个类而已,并没有导入Staff的头文件的内容,如果使用@class Staff以后,在.m文件里还需要使用到Staff的接口部分,需要在.m文件里导入#import“Staff.h”,只有真正导入了头文件,才能使用该类的相关方法。

            【在一定意义上合理的正确的使用@class,其实可以提高编译性能,缩短编译时间】

    【面试题】#import””,#import<>,#include,@class的区别


            3.2  循环引用  
                   A强持有B的指针,B又强持有A的指针,
                    A:
                        @propety(nonatomic,retain)B *b;
                    B:
                        @propety(nonatomic,retain)A *b;

        见【Demo】-【4-循环引用】

//代理指针为什么使用assign去修饰
//目的:为了避免代理对象的相互持有,而造成内存泄露




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值