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开个线程将其优化。
网友评论