iOS 面试题/基础知识回顾---通知,代理,block篇

由于年末要找新工作,复习一下基础知识,准备面试,把自己的理解和找到的资料写下来,记录一下。

通知,代理,block区别


通知:

通知:NSNotification,是iOS开发中一种重要的设计模式,它的实质是程序内部提供的一种广播机制。把接受到的消息根据内部消息转发表,将消息转发给需要的对象。

在检测网络状态,或者许多控件,界面都需要传递某个信息时,这种方法无疑是最方便,最省心的。

创建观察者就一定要移除。



代理:

delegate就是把某个对象要做的事情委托给别的对象去做。那么别的对象就是这个对象的代理,代替它来打理要做的事。

公共接口,方法较多也选择用delegate进行解耦。

个人比较喜欢用delegate,一是代码看着整洁,二是条理清晰。

切勿强引用。


block:

block语法块代码以闭包得形式将各种内容进行传递,可以是代码,可以是数组。闭包就是能够读取其它函数内部变量的函数。就是在一段请求连续代码中可以看到调用参数(如发送请求)和响应结果。

其次block对象本质上就是一个结构体,里面有isa指针指向自己的类(global malloc stack),有desc结构体描述block的信息,__forwarding指向自己或堆上自己的地址,如果block对象截获变量,这些变量也会出现在block结构体中。

最重要的block结构体有一个函数指针,指向block代码块。block结构体的构造函数的参数,包括函数指针,描述block的结构体,自动截获的变量(全局变量不用截获),引用到的__block变量。(__block对象也会转变成结构体)block代码块在编译的时候会生成一个函数,函数第一个参数是前面说到的block对象结构体指针。执行block,相当于执行block里面__forwarding里面的函数指针。

另外根据isa指针,block一共有3种类型的block:

_NSConcreteGlobalBlock 全局静态

_NSConcreteStackBlock 保存在栈中,出函数作用域就销毁

_NSConcreteMallocBlock 保存在堆中,retainCount == 0 

防止循环引用。



注:

block出栈需要将使用的数据从栈内存拷贝到堆内存,当然对象的话就是加计数,使用完或者block置nil后才消除;

delegate只是保存了一个对象指针,直接回调,没有额外消耗。相对C的函数指针,只多做了一个查表动作

这里解释一下堆和栈:

总结区别

    按管理方式分

            对于栈来讲,是由系统编译器自动管理,不需要程序员手动管理

            对于堆来讲,释放工作由程序员手动管理,不及时回收容易产生内存泄露

    按分配方式分

            堆是动态分配和回收内存的,没有静态分配的堆

            栈有两种分配方式:静态分配和动态分配

    静态分配是系统编译器完成的,比如局部变量的分配

            动态分配是有alloc函数进行分配的,但是栈的动态分配和堆是不同的,它的动态分配也由系统编译器进行释放,不需要程序员手动管理

栈是吃了吐 堆是吃了(吃了吐就是LIFO(先进后出),吃了拉就是FIFO(先进先出))

注:此处引用 ---- 作者:海强_hq链接:http://www.jianshu.com/p/c8e1d91dda99

你可能感兴趣的:(iOS 面试题/基础知识回顾---通知,代理,block篇)