写在前面:“分享”看似在输出,但实际上是获得更多。用我们北风网的口号就是“不懂得分享的人,不会很快乐;不懂得分享的机构,不是好机构”。所以,我们北风网不定期会给大家分享一些干货,所有的内容仅供学习之用,也希望大家能将“分享的精神”传递下去。
一、 用一个属性引用UI控件的时候为什么可以用weak?
controller 是被系统用强指针引用者,只要它存在,那么里面的子控件也就存在,controller强引用着它的view controller,又强引用着它的数组对象subviews,数组对象又强引用着它所包含的数组内容,那么创建出来的一个UI控件将其加入subviews的时候,那么就会被一个强指针所引着它
对于内存的合理使用,当我们需要控件的时候就已经有一个强引用在引用着它,我们就不必再弄一个强指针来强引用它;当我们不需要的时候,weak直接释放掉,用strong的话就还会保留它,这就占着内存了.
二、 UITableView 性能优化的原理
iOS设备内存有限,如果使用UITableView显示非常多的数据,就需要非常多的UI TableViewcell
那么设备的内存就会耗尽,解决该问题就需重用 UITableView 对象。
当滚动出列表的时候,部分UITableViewCell 会移出窗口,UITableView会将窗口外的UITableVIewcell 放入一个对象缓存池中;
当UITableView 要求dataSource 返回UITableView时, dataSource 会先查看缓存池中是否有未使用的UITableViewCell ,有就用新的数据配置这个UITableViewCell 重新使用到窗口,这就避免了重新创建对象。
三、什么是抽象类?有什么作用?能实例化吗?
1、抽象类:abstract修饰,它只能用来作父类,本身并没有生成实例的能力
它将一类最公有的属性和方法抽取出来抽象类是将类共有的方法抽取出来,声明为抽象方法, 抽象方法只有声明没有具体的实现, 拥有抽象方法的类就是抽象类; 这样新增一种类型时候只需要继承抽象类,实现抽象方法就可以了,降低了实现新类的难度。
抽象方法修饰符 abstract 抽象类不能被实现
如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类
2、抽象类作用:
(1)用于类型隐藏在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类。
(2)用于拓展对象的行为功能
展开全文
这一组任意个可能的具体实现则表现为所有可能的派生类(子类),模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。
四、objc中向一个nil对象发送消息会发生什么?
如果没有返回值,nothing will happen;
如果有返回值,基本数据类型返回0/0.0/NO等,对象类型返回nil,总的来说就是返回一个假的东西。
五、runloop和线程有什么联系?
Runloop和线程的关系:一个Runloop对应着一条唯一的线程
问题:如何让子线程不死
回答:给这条子线程开启一个Runloop
Runloop的创建:主线程Runloop已经创建好了,子线程的runloop需要手动创建
Runloop的生命周期:在第一次获取时创建,在线程结束时销
六、 什么是懒汉模式,一般用在哪些地方?
懒加载,指得是需要用到的时候才加载,其好处是节省内存空间,不必一开始就创建所有的变量,用到了就创建一块内存,同时也加快了程序运行速度.一般用于我们只需要创建一次的变量就可以的地方,例如字典转模型的数组,以及控制器的view等,都是懒加载的
七、常用的延时执行的几种方式?
perform selector
NSTimer
GCD:dispatch_after
八、写出你想到的设计模式,并简要描述?
单例模式:不管怎么创建,拿到的对象都是同一个
MVC : MVC把软件系统分为三个部分:Model,View,Controller。
MVC有低耦合性、高重用性、可维护性等优点
代理模式 : 代理模式就是实现消息传递的一种机制,委托方有一些任务自己不想完成,但是还需要要实现,则将该任务存放到协议中,由代理完成.但是代理并不会主动的执行任务,需要委托方通知代理,然后代理完成委托方交给的任务.
观察者模式:经典观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己或者做出相应的一些动作。比如KVO,通知中心
九. 是否使用过CoreText或者CoreImage等?如果使用过,请谈谈你使用CoreText或者CoreImage的体验?
用过
CoreText是用于处理文字和字体的底层技术。Quartz能够直接处理字体(font)和字形(glyphs),将文字渲染到界面上,它是基础库中唯一能够处理字形的模块。因此,CoreText为了排版,需要将显示的文本内容、位置、字体、字形直接传递给Quartz。相比其它UI组件,由于CoreText直接和Quartz来交互,所以它具有高速的排版效果。
coreImage是IOS5中新加入的一个Objective-c的框架,提供了强大高效的图像处理功能,用来对基于像素的图像进行操作与分析. iOS提供了很多强大的滤镜(Filter),其中IOS5中有48种,而到了最新的IOS6 Filter已经增加到了93种之多,并且这一数字会继续增加。这些Filter提供了各种各样的效果,并且还可以通过滤镜链将各种效果的Filter叠加起来,形成强大的自定义效果,如果你对该效果很满意,还可以子类化滤镜
十. POST、GET的区别?
(1)POST : 将参数放在请求体中,参数的大小原则上没有限制一般传输的数据包含隐私相关的用POST
(2)GET : 将参数附加在URL后面,因为URL长度的限制,所以参数的大小是有限制的,通常不能超过1KB
GET 在请求URL后面以 ? 的形式跟上发给服务器的参数,多个参数之间用&隔开
十一、 有网络链接的应用中,在取得数据后将json字符串通过框架转为NSDictionary或NSArray,很多人直接使用这些数据来更新UI,说说这样做的缺点,并给出解决办法?
(1)在书写的时候有可能写错Key值或者数组角标;
(2)扩展性不好,且不符合MVC思想;
(3)会造成数据的重复下载,消耗用户的流量,降低用户体验;
(4)如果没有网络或者网络堵塞,那么UI界面接受不到任何数据,显示不了任何内容,用户体验糟糕。
解决的办法:
(1)通过框架转换为字典或者数组后,在转化模型,并进行二级缓存,需要显示的时候从沙盒中取;
(2)利用框架字典转模型重写命名
十二、 id声明的对象有什么特征?
(1)id声明的对象具有运行时的特性,即可用指向任意类型的Objcetive-c的对象,与C中void*的万能指针相似.
(2)在编译阶段不知道它的真实类型,运行时才能知道它的真实类型,所以id类型也不能使用点语法是编译时特性,而且id是运行时特性
十三、你碰到那些导致程序闪退的原因?如何定位闪退的位置?
1、程序闪退的原因?
(1)函数无线递归
(2)运行时,找不到方法(没实现)
(3)访问了某个已经被释放的对象
(4)程序占用内存或CPU过高
(5)子线程阻塞主UI线程过久
(6)从Bundle加载了不存在或者不支持的对象
2、如何定位闪退的位置?
(1)在设置断点的地方,选Add Exception Breakpoint.之后crash就会停在出错的位置.
(2)如果是在测试阶段报错的话,可以在(设置 - 通用 -关于本机 -诊断与用量)里面看到崩溃的堆栈信息.
(3)如果用RAC的话,访问到已经释放了的内存,和内存警告这2种粗出错的几率高一些
十四、 如何实现圆角矩形?有哪些方法可以实现扇形View?
直接修改view的样式,系统提供好的了
view.layer.cornerRadius = 6;
view.layer.masksToBounds = YES;
用layer做就可以了,十分简单.需要库QuartzCore.framework;
画矩形直接利用UIBezierPath给我们封装好的路径方法
(x,y)点决定了矩形左上角的点在哪个位置
(width,height)是矩形的宽度高度
bezierPathWithOvalInRect:CGRectMake(x, y, width, height)
[UIBezierPath bezierPathWithOvalInRect:CGRectMake(50, 50, 100, 100)];
圆角矩形的画法多了一个参数,cornerRadius
cornerRadius它是矩形的圆角半径.
通过圆角矩形可以画一个圆.当矩形是正方形的时候,把圆角半径设为宽度的一半,就是一个圆。
UIBezierPath*path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(50,50,100,100) cornerRadius:50];
扇形:
画扇形的方法为:先画一个圆孤再添加一个一根线到圆心,然后关闭路径.
关闭路径就会自动从路径的终点到路径的起点封闭起下
用填充的话,它会默认做一个封闭路径,从路径的终点到起点.
[path fill];
十五、 Cocoa Touch提供了哪几种CoreAnimation过渡类型?
Cocoa Touch提供了4中 Core Animation 分别是交叉淡化 推挤 显示和覆盖.
十六、能否向编译后得到的类中增加实例变量?能否向运行时创建的类中添加实例变量,为什么?
不能向编译后得到的类中增加实例变量
因为编译后的类以及注册在runtime中,类结构同中objc_ivar_list实例变量的链表和instance_size实例变量的内存大小已经确定
同时runtime会调用class_setlvarLayout或class_setWeakIvarLayout来处理 strong weak 引用。所以不能向存在的类中添加实例变量
能向运行时创建的的类添加实例变量运行时创建的类是可以添加实例变量,调用 class_addIvar 函数。但是得在调用 objc_allocateClassPair 之后,objc_registerClassPair 之前,原因同上。
十七、 请写出你调试解决crash问题的思路及步骤?1)把问题拆分成多个小问题,一步步检验,直到找到问题的根源点
2)程序运行后,查看log信息,找到错误的地方
3)在错误的地方设置断点进行调试,可以加条件断点
4)查看断点运行的信息,进行修改
5) 如果是在测试阶段报错的话,可以在(设置-通用-关于本机-诊断与用量)里面看到崩溃的堆栈信息。
6) 如果用rac的话,访问到已经释放了的内存,和内存警告这2种出错几率要高些。
十八、 NSDictionary类使用了哪些数据结构和算法?
NSDictionary 使用Hash表实现Key/Object存储;
Hash表是一种访问速度很快的数据结构,前提是Hash函数设计合理,能够使数据在各个子节点均匀分布,这一点使用NSString对象可以保证,这是文档中的说明:
Classes such as NSString that are part of Foundation have a good hash function.
十九、 iOS和iPhone做了哪些设计来降低功耗,延长续航时间?作为应用的开发者,又如何避免费电?
1、iOS的省电机制主要有以下几种:
(1)强化的后台机制
(2)墓碑式:伪多任务,应用推至后台后,虽然没有被关闭,但是所有活动都被冻结,只能通过苹果服务器转发的推送来与用户交互
(3)智能调度后台:在一些指定类别的APP,比如社交、新闻类的应 用中,iOS系统会根据应用启动频率、时间和当前网络和电量的状况来智能分配每个应用的后台数据获取频率和启动时长,开发者自己不能设置数据具体什么时候更新
(4)真后台:苹果也提供一些有诸多限制的接口来保证真后台,只供特定应用行为调用,比如后台音频,定位,上传下载等。
2、作为开发者如何省电
(1)首先当然优化代码,积极合理地使用runloop,多线程等技术。
(2)其次是尽量少地调用一些费电的接口,比如频繁的定位,频繁的后台更新数据,如无必要,尽量不用。
二十、 ARC内存管理原则是什么?
永远不写retain,release和autorelease三个关键字就好~这是ARC的基本原则。