美文网首页
2019基础复习

2019基础复习

作者: UILabelkell | 来源:发表于2019-10-20 21:50 被阅读0次

1、我们说的Objective-C是动态运行时语言是什么意思?
答:OC的动态运行时,是指OC具有动态类型和动态绑定的特性。动态类型能使程序直到执行时才确定对象的所属类, 其具体引用的对象在运行时才能确定。 动态绑定能使程序直到运行时才确定调用对象的实际方法。

2、为什么代理要用weak?代理的delegate和dataSource有什么区别?block和代理的区别?
答:1、 防止循环引用。例如View有一个协议,需要一个代理实现回调。一个Controller添加这个View,并且遵守协议,成为View的代理。如果不用week,用strong,Controller ->View -> delegate -> Controller,就循环引用了。

delegate偏重于与用户交互的回调,有那些方法可以供我使用,例如UITableviewDelegate;dataSource偏重于数据的回调,view里面有什么东西,属性都是什么,例如UITableviewDatasource;

block 一般分为三种 :全局block 、保存在栈中的 block、 保存堆中的block
(1)全局静态 block,不会访问任何外部变量,执行完就销毁;
^{
NSLog(@"Hello World!");
}();
(2)保存在栈中的 block,当函数返回时会被销毁,和第一种的区别就是调用了外部变量。
[UIView animateWithDuration:3 animations:^{
self.view.backgroundColor = [UIColor redColor];
}];
(3)保存在堆中的 block,当引用计数为 0 时会被销毁。例如按钮的点击事件,一直存在,即使执行过,也不销毁,因为按钮还可能被点击。直到持有按钮的View被销毁,它才会被销毁。
BLOCK 不好的地方 :blcok的运行成本高。block出栈需要将使用的数据从栈内存拷贝到堆内存,当然对象的话就是引用计数加1,使用完或者block置nil后才销毁。delegate只是保存了一个对象指针(一定要用week修饰delegate,不然也会循环引用),直接回调,没有额外消耗。就像C的函数指针,只多做了一个查表动作。

3、什么时候需要在程序中创建内存池?

相关文章

网友评论

      本文标题:2019基础复习

      本文链接:https://www.haomeiwen.com/subject/qxmheqtx.html