1解释self = [super init]方法
其实就是容错处理,当父类初始化失败,会返回一个nil,表示初始化失败。由于继承的关系,子类是需要拥有父类的实例和行为,必须先初始化父类,再初始化子类
2线上App崩溃
方法一,在源生代码中修改,提交
方法二,利用第三方平台,JSPatch 使用JS调用oc源生接口,替换任意OC方法,我的认识就是可以不通过重新上架app项目到appStore就可以修改oc代码
3App中混合H5开发,优缺点:
方法一:使用UIWebView或者WKWebView(ios8以后)
通过UIWebView代理方法拦截,判断scheme是否是约定好的,调用本地API是哪
shouldStartLoadWithRequest
方法二:ios7以后,直接通过JavaScriptCore库,通过往JS DOM注入对象(某个类的实例)
优缺点:加入h5,比原生要慢很多,体验不好;可以实现嵌入别的功能入口,可以随时更改,不用更新版本就可以上线
4static
函数体内,作用范围是该函数体,该变量的内存只被分配一次,下次调用时仍然维持上次的值;模块内是全局变量,可以被模块内的所有函数访问,外部不行
5地图和定位:
定位,创建位置管理器请求用户授权;请求目的地和当前位置的针线;创建渲染物对象在mapView代理方法中根据折现创建渲染物,并设置颜色
6常见的Http状态码:302请求重定向;304网页自请求者上次请求后没有更新,可以节省带宽
500以上是服务器错 ;400以上是请求链接错误或者找不到服务器;200以上是用户成功获取到了请求的文件,正确;100以上是请求接受成功‘
7isa指针指向什么
每一个对象内部都有isa指针,这个指针指向它真正的真是类型,根据这个指针就能知道将来调用哪个类的方法
8触摸事件的传递:
触摸事件的传递是从父控件传递到子控件,如果父控件不能接收触摸事件,那么子控件就不可能接收到触摸事件,不能接收触摸事件的四种情况:不接收用户交互userInteractionEnabled = NO;隐藏hidden = YES;透明alpha <= 0.01;未启用enabled = NO;
9事件响应者链
如果当前view是控制器的view,那么就传递给控制器,如果控制其不在,则将其传递给它的父控件,在视图层次结构最顶层视图也不能处理接收到的事件或消息,将事件或消息传递给UIWindow对象进行处理;如果UIWindow对象也不能处理,将事件或消息传递给UIApplication对象,如果UIApplication也不能处理对象或消息,则将丢弃掉
10UITableView的复用机制
每次创建cell的时候,通过dequeueReusableCellWithIdentifier:方法创建cell,先到缓存池中找指定标识的cell,如果没有直接返回nil,如果没有找到标识的cell,会通过initWithStyle:reuseIdenitifier:创建一个cell,当cell离开界面的时候,会被放到缓存池中,供下次使用
11沙盒目录
Application:存放程序源文件,上架前经过数字签名,上架后不可以更改
Documents:常用目录,iClound备份目录,存数据
Library:
Caches:存放体积大又不需要备份的数据
Preference:设置目录,iCloud会备份设置信息
tmp:存放临时文件,不会被备份,这个文件下的数据有随时被清除的可能
12pushViewController和presentViewController有什么区别
两个都是在多个视图控制器里跳转的函数
presentViewController提供是一个模态视图控制器(modal)
pushViewController提供一个栈控制器数组,push/pop
13UIView和CALayer是什么关系
UIView显示在屏幕上归功于CALayer,通过调用drawRect方法渲染自身的内容,调节CALayer属性可以调整UIView的外观,UIView继承UIResponder,比起CALayer可以影响用户事件,ios6之后,可以方便的通过视图调试功能查看图层之间的关系
UIView是ios系统界面中元素的基础,所有的界面元素都继承它,内部是由Core Animation 来实现,它的真正的绘图部分,是由一个叫做CALayer(core Animation Layer)的类管理。UIView本身,访问有关绘图和坐标有关的属性,frame/bounds,实际上内部都是访问CALayer的相关属性
14
浅拷贝和深拷贝的区别:
浅Copy:可以理解为指针的复制,只是多了一个指向这块内存的指针,共用一块内存。
深Copy:理解为内存的复制,两块内存是完全不同的,也就是两个对象指针分别指向不同的内存,互不干涉。
15drawRect方法:
只有在此方法中,系统才能获取到上下文环境 ; rect参数是绘图上下文的大小;drawRect方法在view显示的时候调用一次
重绘:【self setNeedsDisplay]; 系统会帮助调用drawRect方法,清除掉原来的,再绘制新的
[self setNeedsDisplayInRect:CGRect]; 固定区域的重绘
不能手动调用,否则获取不到
16app崩溃 收集问题
使用腾讯的bugly 输入程序id 关联进去,然后程序员查看崩溃日志
17动画:分为显示动画和隐式动画
在UIView上的事显示动画,不用我们手动去开启,只要直接调用animation的接口就可以了。
在CALayer上的动画叫隐式动画,需要我们去手动开启,隐式动画分为三种,属性动画,组动画和转场动画,属性动画又分为基础动画和帧动画,帧动画需要指定路径
隐式动画有隐式代理:动画的开始和动画的结束
18字符串使用copy
如果不使用copy,
@property(nonatomic,strong)NSString *str;
NSMutableString *string = [NSMutableString string];
[string appendString:@"hello"];
self.str = string;
NSLog(@"%@",self.str);
[string appendString:@"world"];
NSLog(@"%@",self.str);
}
NSString中copy的问题[3807:239891] hello
NSString中copy的问题[3807:239891] helloWorld
我们只给self.str附了一次值,但是self.str 的值改变了,这是因为把可变字符的地址指向了str,所以string的值改变了,self.str也跟着改变,
改为copy后,保证了在代码中数据的安全。 不可变不会有这种问题
19因为+load是在类被初始化时候就被调用的。+initialize是在收到消息之后才调用,如果应用不发送消息给它,它就永远不可能执行
20这个写法会出什么问题:@property (copy) NSMutableArray *array;
NSMutableArray用copy修饰有时就会crash,因为对这个数组进行了增删改操作,而copy后的数组变成了不可变的NSArray,没有响应的增删改方法,所以对其进行增删改操作就会报错
21 简述你对UIView、UIWindow和CALayer的理解
UIWindow对象是所有UIView的根,管理和协调的应用程序的显示。UIWindow类是UIView的子类,可以看作是特殊的UIView。一般应用程序只有一个UIWindow对象,即使多个UIWindow对象,也只有一个UIWindow可以接受到用户的触屏事件。
UIView是用来显示内容的,可以处理用户事件。
CALayer是用来绘制内容的,对内容进行动画处理依赖与UIView来进行显示,不能处理用户事件。
UIView和CALayer是相互依赖的关系。UIView依赖与calayer提供的内容,CALayer依赖uivew提供的容器来显示绘制的内容。归根到底CALayer是这一切的基础,如果没有CALayer,UIView自身也不会存在,UIView是一个特殊的CALayer实现,添加了响应事件的能力。UIView来自CALayer,高于CALayer,是CALayer高层实现与封装。UIView的所有特性来源于CALayer支持。