iOS核心面试题整理
2016-04-21 本文已影响309人
ParadiseKiss
下面整理一些iOS常问到面试题,方便大家整理。
1.说说你是怎么进行iOS性能优化的?
1. 视图复用,比如UITableViewCell,UICollectionViewCell等。
2. 数据缓存,比如用SDWebImage实现图片缓存,提高用户体验,节省流量。
3. 任何情况下都不能堵塞主线程。
4. 响应时间短。
5. 用arc管理内存。
6. 正确使用集合类,比如NSArray,NSDictionary,NSSet。如果数据量大的时候,数组操作就需要移动大量元素,可以考虑用链表等数据结构。
7. 如果有多个下载同时并发,可以控制并发数。
8. 在合适的地方使用懒加载。
9. 重用重大开销对象,比如:NSDateFormatter、NSCalendar。
10. 选择合适的数据存储。
11. 加速启动时间。
12. 合适的地方使用自动释放池。
13. 避免循环引用。必须delegate用retain、strong修饰,block可能导致循环引用,NSTimer也可能导致内存泄露等。
14. 当涉及到定位的时候,不用的时候最好把定位服务关闭。因为定位耗电、流量。
15. 加锁对性能有重大开销。
16. 界面最好不要添加过多的subViews.
2.如何保证tableView可以平滑的滚动?
1. Cell一定要复用。
2. 尽量避免添加过多的子视图。
3. 如果行高不等时,需要缓存行高。
4. 如果Cell的内容来自网络,需要异步加载,请求缓存请求的数据。
5. Cell上尽量避免复杂的计算。
6. 尽量不使用cellForRowAtIndexPath,如果需要,只用一次然后缓存对象。
7. 尽量使用不透明的视图。
8. 要不堵塞主线程。
9. 尽量不要对Cell的子视图频繁添加、删除操作。
3.说说你对缓存方案的看法?
缓存方案一般有3种:
1. 网络优先:也就是说开始总是从网络获取,如果获取失败,然后从本地获取。这个一般用在网络数据经常更新的情况。
2. 本地优先:在一段时间内总是从本地获取,如果超过指定的时间,然后从网络重新获取。
3. 混合方式:先从本地获取,先展示本地数据,同时从网络获取,请求完后刷新界面。
4.谈谈你对单例的理解?
单例就是单个实例,也就是在当前应用程序的生命周期中只有一个实例。
如何保证当前对象只有一个实例呢?可以从mrc和arc说起,mrc的单例和arc单例写法就是多几个方法而已。
mrc环境下:
- 提供一个访问当前单例对象的类方法,并且返回当前单例对象的实例。
static MrcManager *manager = nil;
+ (instancetype)manager
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [[self alloc] init];
});
return manager;
}
- 重写allocWithZone:方法,防止用户通过alloc创建返回一个新的实例。
//alloc会触发
+ (id)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [super allocWithZone:zone];
});
return manager;
}
- 重写copyWithZone:方法,即使调用copy也是返回当前单例对象。
//copy会自动触发
- (id)copyWithZone:(nullable NSZone *)zone
{
return self;
}
- 重写mutableCopyWithZone:方法
//mutableCopy会自动触发
- (id)mutableCopyWithZone:(nullable NSZone *)zone
{
return self;
}
- 重写retain,保证retain当前对象不会增加引用计数,所以直接返回self即可。
- (instancetype)retain
{
return self;
}
- 重写release,防止调用release释放当前单例对象。
- (oneway void)release
{
//空实现,即使调用release,其实什么都没有做,对当前单例对象不会造成任何影响。
}
- 重写autorelease。
- (instancetype)autorelease
{
return self;
}
- 重写retainCount,其实单例对象的引用计数意义不大,但是不能返回0咯。
- (NSUInteger)retainCount
{
return MAXFLOAT;
}
上面是mrc的单例写法,这样我们才能保证当前单例对象在任何情况下都是唯一的实例。
arc环境下:
mrc会的话,arc就简单了,只是不需要重写retain,release,autorelease,retainCount方法就可以了,剩下的都一样,这里就不在重复写咯。
先整理这么多,后续补充。