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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,307评论 30 472
  • 多线程、特别是NSOperation 和 GCD 的内部原理。运行时机制的原理和运用场景。SDWebImage的原...
    LZM轮回阅读 6,083评论 0 12
  • iOS面试小贴士 ———————————————回答好下面的足够了------------------------...
    不言不爱阅读 6,182评论 0 7
  • 史上最全的iOS面试题及答案 iOS面试小贴士———————————————回答好下面的足够了----------...
    Style_伟阅读 7,083评论 0 35
  • 《Objective-C高级编程》这本书就讲了三个东西:自动引用计数、block、GCD,偏向于从原理上对这些内容...
    WeiHing阅读 13,320评论 10 69