2018 iOS面试题

作者: Lightoflife | 来源:发表于2018-03-12 21:53 被阅读24次

    1、写出NSArray的几种遍历方式

    答: for循环 、for...in

    2、类方法和实例方法有什么区别?

    答:

    1.实例方法/动态方法

        a).标识符:-

        b).调用方式:(实例对象    函数)

        c).实例方法在堆栈上。

    2.静态方法/类方法

        a).标识符:+

        b).调用方式:(类    函数)

        c).静态方法在堆上分配内存。

    3、为什么代理要用weak? 代理的delegate和 dataSource有什么区别?

    代理是使用weak来修饰的。1.使用weak是为了避免循环引用。2.当使用weak修饰的属性,当对象释放的时候,系统会对属性赋值nil,object-c有个特性就是对nil对象发送消息也就是调用方法,不会cash。

    delegate:传递的是事件(even),代理可以让A对象通知B对象,我(A)发生的变化,前提B遵循了A的代理,并且实现了A的代理方法,如cell点击事件。

    dataSource: 传递的是数据。如果A对象声明了数据源,当我们创建A对象的时候,我们就该实现数据源,来告诉A,他所需要的一些数据。例如:tableView数据源方法,需要告诉它,我要实现几组cell,每组cell多少行cell,实现的cell什么样式,什么内容

    同样delegate和dataSource,都是可以使用require和optional来修饰的

    4、NSString有时候为什么要用copy关键字,如果用Strong会有什么问题?

    答:当源字符串是不可变类型时      copy  strong   改变源字符串 效果一样;

    当源字符串是可变类型时      copy  修饰的是深拷贝   改变源字符串  不影响copy的属性内容      strong修饰的属性 就随着源字符串的改变而变了

    参考链接:http://blog.csdn.net/qq_34900204/article/details/73932866

    5、介绍下你了解的数据持久化的方案

    1)plist文件(属性列表)

    2)preference(偏好设置)

    3)NSKeyedArchiver(归档)

    4)SQLite 3

    5)CoreData

    参考链接:http://www.cocoachina.com/ios/20150720/12610.html

    6、block的实质是什么?一共有几种block? 都是什么情况下生成的?

    答:block的实质是object-c对象,一共有3种,

    block:存储位置,可能分为3个地方:代码去,堆区、栈区(ARC情况下会自动拷贝到堆区,因此ARC下只能有两个地方:代码去、堆区)

    代码区:不访问栈区的变量(如局部变量),且不访问堆区的变量(alloc创建的对象),此时block存放在代码去。

    堆区:访问了处于栈区的变量,或者堆区的变量,此时block存放在堆区。–需要注意实际是放在栈区,在ARC情况下会自动拷贝到堆区,如果不是ARC则存放在栈区,所在函数执行完毕就回释放,想再外面调用需要用copy指向它,这样就拷贝到了堆区,strong属性不会拷贝、会造成野指针错区。

    7、objc在向一个对象发送消息时,发生了什么?

    答:objc在向一个对象发送消息时,runtime库会根据对象的isa指针找到该对象实际所属的类,然后在该类中的方法列表以及其父类方法列表中寻找方法运行,然后在发送消息的时候,objc_msgSend方法不会返回值,所谓的返回内容都是具体调用时执行的。

    8、解释一下你所理解的KVO和KVC

    1.KVO KVC 没联系

    2.KVO 是监听属性值的改变

    3.KVO 底层实现原理是系统给当前类创建子类 , 在子类 setter 方法调用父类的 setter 方法

    通过修改 isa 指针指向系统创建的子类 实现当前类属性值改变的监听

    9、简单介绍下你比较精通的技术点。

    自行发挥

    10、__block和block有什么区别?

    答:我们知道在Block使用中,Block内部能够读取外部局部变量的值。但我们需要改变这个变量的值时,我们需要给它附加上__block修饰符。__block另外一个比较多的使用场景是,为了避免某些情况下Block循环引用的问题,我们也可以给相应对象加上__block 修饰符。

    block是匿名函数。

    11、有了解过图片优化的框架吗 ?如SDWebImage,其基本原理是什么?

    1)入口 setImageWithURL:placeholderImage:options: 会先把 placeholderImage 显示,然后 SDWebImageManager 根据 URL 开始处理图片。

    2)进入 SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交给 SDImageCache 从缓存查找图片是否已经下载 queryDiskCacheForKey:delegate:userInfo:.

    先从内存图片缓存查找是否有图片,如果内存中已经有图片缓存,SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo: 到 SDWebImageManager。

    3)SDWebImageManagerDelegate 回调 webImageManager:didFinishWithImage: 到 UIImageView+WebCache 等前端展示图片。

    4)如果内存缓存中没有,生成 NSInvocationOperation 添加到队列开始从硬盘查找图片是否已经缓存。

    5)根据 URLKey 在硬盘缓存目录下尝试读取图片文件。这一步是在 NSOperation 进行的操作,所以回主线程进行结果回调 notifyDelegate:。

    6)如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo:。进而回调展示图片。

    7)如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片,回调 imageCache:didNotFindImageForKey:userInfo:。

    8)共享或重新生成一个下载器 SDWebImageDownloader 开始下载图片。

    9)图片下载由 NSURLConnection 来做,实现相关 delegate 来判断图片下载中、下载完成和下载失败。

    10)connection:didReceiveData: 中利用 ImageIO 做了按图片下载进度加载效果。

    11)connectionDidFinishLoading: 数据下载完成后交给 SDWebImageDecoder 做图片解码处理。

    图片解码处理在一个 NSOperationQueue 完成,不会拖慢主线程 UI。如果有需要对下载的图片进行二次处理,最好也在这里完成,效率会好很多。

    12)在主线程 notifyDelegateOnMainThreadWithInfo: 宣告解码完成,imageDecoder:didFinishDecodingImage:userInfo: 回调给 SDWebImageDownloader。

    imageDownloader:didFinishWithImage: 回调给 SDWebImageManager 告知图片下载完成。

    通知所有的 downloadDelegates 下载完成,回调给需要的地方展示图片。

    将图片保存到 SDImageCache 中,内存缓存和硬盘缓存同时保存。写文件到硬盘也在以单独 NSInvocationOperation 完成,避免拖慢主线程。

    SDImageCache 在初始化的时候会注册一些消息通知,在内存警告或退到后台的时候清理内存图片缓存,应用结束的时候清理过期图片。

    SDWI 也提供了 UIButton+WebCache 和 MKAnnotationView+WebCache,方便使用。

    SDWebImagePrefetcher 可以预先下载图片,方便后续使用。

    参考链接:https://www.jianshu.com/p/ba4cbf8dfe49

    12、UITableView是怎么进行性能优化的?

    答:可以从缓存高度(给个默认值预估)、单元格重用机制、使用不透明视图提高渲染速度、异步缓存单元格网络图片、异步绘制单元格

    13、平时用到的定时器NSTimer准吗?如何将其进行优化?

    答:不准,可以NSRunloop开个线程将其优化。

    相关文章

      网友评论

        本文标题:2018 iOS面试题

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