1.+load和+initialize的区别是什么?
解析:学习一个方法, 主要从两方面入手.第一是,这个方法什么时候调用,第二它的作用是什么.
- ①load
什么时候调用:当程序一启动,就会把所有类加载进内存,只要一个类加载进内存,就会调用这个类的load方法.
调用次数:只会调用一次
作用:初始化类的操作 - ②initialize
什么时候调用:当第一次使用这个类或者它的子类就会调用
调用次数:有可能会调用多次,比如说这个类有一个子类,第一次使用这个子类的时候,会调用2次.
作用:初始化类的操作
2.runtime实现的机制是什么,有哪些用法,一般用于干嘛?
是什么?
- runtime是运行时机制.它是一套比较底层的纯C语言API,属于一个语言库,包含了很多底层的C语言API.
- 平时编写的OC代码,在程序运行中,其实最终都是转成了runtime的C语言代码,runtime算是OC的幕后工作者.
** 有哪些用法?**
- ①发送消息
- ②交换方法(系统自带的方法功能不够,给系统自带的方法扩展一些功能,并且保持原有的功能)
- ③动态创建一个类(比如KVC底层实现)
- ④动态添加方法(如果一个类方法非常多,加载类到内存的时候也比较耗费资源,需要给每个方法生成映射表,可以使用动态给某个类,添加方法解决)
- ⑤字典转模型
3.什么时候会发生EXC_BAD_ACCESS异常?
指向僵尸对象(不可用内存)的指针 给野指针发消息会报EXC_BAD_ACCESS错误
4.category和extension的区别
解析
先阐述一下这两个词的意思,再分别说下这两个类的作用 和使用场景 就OK了
- category:分类
1.作用:给一个类扩展一些方法,不能扩展属性
2.使用场景: 扩展系统的类 - extension:类目,类扩展,匿名分类
1.作用:扩充属性和方法声明
2.使用场景: 扩展自定义类
5.你是怎么理解bounds的
解析
遇到这种不好回答的问题,首先说出它的字面意思
- 1.内容:每个控件都有自己的内容,一个控件子控件都是相对于内容
- 2.bounds可以设置控件尺寸
- 3.bounds描述一块区域,描述的是可视范围在内容的区域
- 4.修改Bounds的x,y,不会影响当前控件在父控件位置,本质修改的是内容原点
6.UICollectionView使用步骤?
- 1.初始化布局 流水布局
- 2.设置数据源
- 3.注册cell
- 4.自定义cell
7.简述你对协议的理解?
解析
怎么去使用这个知识点 (这是初学者一般这么回答,low);
为什么要使用协议 (思想),什么时候才需要使用协议 (开发场景)
- 1.有时候自己不想做的事情,搞一个代理去管理,这时候只要代理遵守了某个协议,就能成为我代理.
- 2.UIScrollView,监听UIScrollView滚动,这时候需要遵守UIScrollView协议
注意点:代理一定要记得实现方法.
8.UITabBarController控制器中view的内部结构
- 它view内部的结构为一个专门存放子控制器View的View,和一个UITabBar条.
注意:UITabBar的高度为49.
UI基础考点
1.通过代码如何自定义控件? 并且简单的描述下每一个步骤的理由?
- 1.新建一个继承UIView的类,(所谓自定义控件就是继承系统自带的控件写一个自己的控件)
- 2.在
initWithFrame
方法中添加子控件(保证别人在外面不管是通过init
还是initWithFrame
创建都能够添加子控件,因为init
方法内部会调用initWithFrame
- 3.在
layoutSubViews
方法中设置子控件的frame(因为在InitWithFrame方法中当前控件尺寸可能没值,所以计算不了子控件的位置和尺寸,而在layoutSubViews
方法,能够拿到当前控件的尺寸) - 4.提供一个模型属性,重写模型属性的set方法(保证在别人在设置数据的那一刻就可以拿到数据设置到对应的子控件上)
2.通过XIB如何自定义控件? 并且简单的描述下每一个步骤的理由?
- 1.新建一个继承UIView的类,(所谓自定义控件就是继承系统自带的控件写一个自己的控件)
- 2.新建一个xib文件(xib的文件名最好和类名一样)
- 3.修改最外面那个控件的class为控件类名(只有修改类名,当时候从xib中出来的才是我这种类型的控件)
- 4.提供一个模型属性,重写模型属性的set方法(保证在别人在设置数据的那一刻就可以拿到数据设置到对应的子控件上)
3.用一个属性引用UI控件的时候为什么用weak?
- 因为UI控件添加到父控件中以后,会有强指针指向这个对象.在搞一个属性引用这个对象,用弱引用就可以.
4.简述UITableView性能优化的原理?
- 当滚动列表时,部分UITableViewCell会移出窗口,UITableView会将窗口外的UITableViewCell放入一个对象池中,等待重用。当UITableView要求dataSource返回UITableViewCell时,dataSource会先查看这个对象池,如果池中有未使用的UITableViewCell,dataSource会用新的数据配置这个UITableViewCell,然后返回给UITableView,重新显示到窗口中,从而避免创建新对象.