由于年末要找新工作,复习一下基础知识,准备面试,把自己的理解和找到的资料写下来,记录一下。
通知,代理,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