面试的好处如同考试,获得肯定或者知道不足。对于ios,object编程的一些面试题做一些整理,如下:
1、notification是多线程的吗?
通知是监听者模式在ios编程里的应用,ios 的通知机制,包括通知发布,通知监听,通知移除。通知的发布看书简单的接口调用,其实是cocoa为用户做了监听者模式的封装,我们运行时没有发现其阻塞我们的操作,发布通知时后台另启线程,接收时回调到主线程进行处理。
2、在项目什么时候选择使用GCD,什么时候选择NSOperation?
项目中使用NSOperation的优点是NSOperation是对线程的高度抽象,在项目中使用它,会使项目的程序结构更好,子类化NSThreadOperation的设计思路,是具有面向对象的优点(复用、封装),使得实现是多线程支持,而接口简单,建议在复杂项目中使用。
项目中使用GCD的优点是GCD本身非常简单、易用,对于不复杂的多线程操作,会节省代码量,而Block参数的使用,会使代码更为易读,建议在简单项目中使用。
//创建一个队列
dispatch_queue_t queue = dispatch_queue_create("test", NULL)
//创建异步线程
dispatch_async(queue,^{
//多线程
//回到主线程执行
dispatch_sync(dispatch_get_main_queue(),^{
//回到主线程
});
});
3、ARC环境下重写set方法
-
weak
-
(void)setMyObject:(id)newValue
{
if(_myObject != newValue) {
_myObject = nil;
_myObject = newValue;}
}
-
-
assign
-(void)setMyObject:(id)newValue
{
_myObject = newValue;
} -
retain (arc不准许调用retain)
-(void)setMyObject:(id)newValue
{
if(_myObject != newValue){
[_myObject release];
_myObject = [newValue retain];
}
} -
copy
-(void)setMyObject:(id)newValue
{
if(_myObject != newValue)
{
[_myObject release];
_myObject = [newValue copy];
}
}
4、 如何自定义tableview下拉、上拉刷新?
a给UIScorllerView添加类别,提供增加头部和尾部视图的方法
b定义头部、尾部视图,应该存在一些属性
#pragma mark - 父控件
@property (nonatomic, weak, readonly) UIScrollView *scrollView;
@property (nonatomic, assign, readonly) UIEdgeInsets scrollViewOriginalInset;
#pragma mark - 内部的控件
@property (nonatomic, weak, readonly) UILabel *statusLabel;
@property (nonatomic, weak, readonly) UIImageView *arrowImage;
@property (nonatomic, weak, readonly) UIActivityIndicatorView *activityView;
5 、iOS9.2.1安全登录如何判断设备唯一性?
iOS9.2.1以后一旦删除应用就会重新生成uuid,导致uuid不能作为唯一标示符。需加入SSKeyChain作处理
6聊聊你了解的runtime,runloop, release pool.
-
A 、runtime
objc/runtime.h是系统提供的一些,用于修改运行时动态修改对象属性,和方法的一些C方法。后面作为专题来讲解。
如"UINavigationBar+Awesome.h"提供一些运行时修改UINavigationBar没有提供属性修改方法:@interface UINavigationBar (Awesome)
-
(void)lt_setBackgroundColor:(UIColor *)backgroundColor;
-
(void)lt_setContentAlpha:(CGFloat)alpha;
-
(void)lt_setTranslationY:(CGFloat)translationY;
-
(void)lt_reset;
@end
-
后面详细讲解。
- B、runloop
run loops 是线程相关的基础框架的一部分。一个run loop是就是一个事件处理循环,不停调度工作,以及处理输入事件,是一个让线程能随时处理事件,单不退出的机制,相当于while(1)循环。
run loop同时负责autorelease pool的创建和释放。
线程和Runloop是一一对应的,其关系保存在一个全局的Dictionary里。线程生命周期存在五个状态:创建、就绪、运行、阻塞、死亡。线程刚创建是并没有Runloop,需要你主动获取。
NSRunloop可以保持一个线程一直为活动状态,并在线程结束时销毁掉。
- C 、 release pool.
If you use Automatic Reference Counting (ARC), you cannot use autorelease pools directly. Instead, you use@autoreleasepool blocks. For example, in place of:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Code benefitting from a local autorelease pool.
[pool release];
you would write:
@autoreleasepool {
// Code benefitting from a local autorelease pool.
}