iOS面试iOS开发

0. iOS面试题基础篇

2016-07-16  本文已影响326人  iYeso
1. 父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。
2. KVO,NSNotification,delegate及block区别
3. 将一个函数在主线程执行的4种方法
dispatch_async(dispatch_get_main_queue(), ^{ 
    //需要执行的方法 
});
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];  //主队列 
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ 
    //需要执行的方法 
}]; 
[mainQueue addOperation:operation];
[self performSelector:@selector(method) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES modes:nil]; 
[self performSelectorOnMainThread:@selector(method) withObject:nil waitUntilDone:YES]; 
[[NSThread mainThread] performSelector:@selector(method) withObject:nil];
[[NSRunLoop mainRunLoop] performSelector:@selector(method) withObject:nil];
4. 如何让计时器调用一个类方法
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerMethod) userInfo:nil repeats:YES]; 
-(void)timerMethod 
{ 
    //调用类方法 
    [[self class] staticMethod]; 
} 
-(void)invalid 
{ 
    [timer invalid]; 
    timer = nil; 
}
5. 如何重写类方法
6. NSTimer创建后,会在哪个线程运行。
7. id和NSObject*的区别
8. iOS 核心框架
9. iOS核心机制
10. 数据结构
11. 面向对象编程

• 封装、继承、多态
• 设计模式6个原则
• 设计一个类的功能,如何划分粒度(单一职责)
• 接口隔离。
• 如果有一个鸟类,有飞的动作,一个鸵鸟继承它是合适的吗(里氏替换)
• 类之间的依赖如何依赖偶合度最小(依赖倒转)
高层依赖低层,低层不能依赖高层。依赖接口,不能依赖具体的类。
• 如果A要调用C函数,但C是B的成员类,应该如何设计?(迪米特)
• 如何设计类,能做到只增加代码,而不修改代码,有哪些经验(开放封闭)
通过设计模式解决。

12. 计算机技术

• 计算机网络: TCP/IP、HTTPCDN、SPDY
• 计算机安全: RSA、AES、DES
• 操作系统:线程、进程、堆栈、死锁、调度算法

13. iOS新特性、新技术

• iOS7 UIDynamic、SpritKit、新布局、扁平化
• iOS8 应用程序扩展、HealthKit、SceneKit、CoreLocation、TouchID、PhotoKit
• iOS9
• Apple Watch

14. 简述OC中内存管理机制.

内存管理机制:使用引用计数管理,分为ARC和MRC,MRC需要程序员自己管理内存,ARC则不需要.但是并不是所有对象在ARC环境下均不需要管理内存,子线程和循环引用并不是这样.与retain配对使用的是release,retain代表引用计数+1,release代表引用计数-1,当引用计数减为0时,对象则被系统自动销毁.与alloc配对使用的是dealloc,alloc代表为对象开辟内存空间,dealloc则代表销毁对象的内存空间.

15.readwrite,readonly,assign,retain,copy,nonatomic,atomic,strong,weak的作用?

读写属性:readonly和readwrite;  语义属性:assign/retain/copy;   原子性:nonatomic.

16. 内存分为5个区,分别是栈区,堆区,全局区,文字常量区,程序代码区.
17. 类变量的@protected,@private,@public,@package,声明各有什么含义?
18. 线程是什么?进程又是什么?区别和联系.
19. 对多线程开发的理解,iOS中有几种实现多线程的方式.
20. 详解三种实现多线程的方式

####### 20.1 GCD:

GCD里面包含了串行队列、并行队列、主队列、全局队列.

Dispatch_queue_t q = dispatch_queue_create(“qqq”,DISPATCH_QUEUE_SERIAL);//创建一个串行队列 
Dispatch_sync(q,^{ 
});//开启同步任务 

Dispatch_async(q,^{ 
});//开启异步任务 
dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); 

####### 20.2 NSThread
获取当前线程:NSThread * current = [NSThread currentThread];
获取主线程:NSThread * main = [NSThread mainThread];

使用NSThread创建线程的两种方式: 
- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument; 

+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument; 
 
暂停当前线程: 
[NSThread sleepForTimeInterval:2];

####### 20.3 NSOperationQueue

[queue addOperationWithBlock:^(){ 
}]; 
21. 线程同步和异步的区别?ios中如何实现线程的同步?

同步:任务顺序执行,下一个任务依赖于上一任务的完成.
异步:任务执行顺序不定,一起执行.
实现:设置依赖:NSOpreationQueue,   GCD中的串行队列.

22. iOS类是否可以多继承,如果没有,怎么实现?
23. 栈和堆的区别?

栈:内存系统管理(系统开辟,系统释放),先进后出.
堆:内存自己管理(自己开辟,自己释放).先进先出.

24. iOS本地数据存储都有几种方式?
25. ios动态类型和动态绑定

多态:父类指针指向子类对象.
动态类型:只有在运行期,才能确定其真正类型.
动态加载:根据不同的条件,加载不同的资源.32和64位.

26. 深拷贝和浅拷贝的理解.

深拷贝;拷贝的内容.
浅拷贝:拷贝的指针.
深拷贝如:

NSMutableDictionary  * dic = [@{} mutableCopy]; 

NSMutableArray  * ary = [@[] mutableCopy];
27. 怎么实现一个singleton的类.

单例是一种设计模式,对象只有一个.缺点:对象不会被释放,如果创建很多的话会占用很多内存,优点:可以当做工具类使用.

static SortDetailsModelDown * single = nil; 
 
+(SortDetailsModelDown *)shareSortDetailsModelDown{ 
     
    @synchronized(self){ 
         
        if (!single) { 
             
            single = [[SortDetailsModelDown alloc]init]; 
             
        } 
         
    } 
    return single; 
}
28. 什么是安全释放?

先释放再置空.

29. RunLoop是什么?

事件循环,是线程里面的一个组件.主线程的RunLoop是自动开启的.分为:计时源(timer source),事件源(输入源):input source.防止CPU中断(保证程序执行的线程不会被系统终止).

Runloop提供了一种异步执行代码的机制,并不能并行执行任务,是事件接收和分发机制的一个实现.每一个线程都有其对应的RunLoop,但是默认非主线程的RunLoop是没有运行的,需要为RunLoop添加至少一个事件源,然后run它.

一般情况下我们是没有必要去启动线程的RunLoop的,除非你在一个单独的线程中需要长时间的检测某个事件.

RunLoop,正如其名所示,是线程进入和被线程用来响应事件以及调用事件处理函数的地方.

input source传递异步事件,通常是来自其他线程和不同程序的消息.

timer source传递同步事件.

当有事件发生时,RunLoop会根据具体的事件类型通知应用程序作出响应.

当没有事件发生时,RunLoop会进入休眠状态,从而到达省电的目的.

当事件再次发生时,RunLoop会被重新唤醒,处理事件.

一般在开发中很少会主动创建RunLoop,而通常会把事件添加到RunLoop中.

30. 什么是序列化和反序列化,可以用来做什么?如何在OC中实现复杂对象的存储.

序列化和反序列化:归档和反归档,进行本地化,进行数据存储.
CoreData:数据托管.有四种存储方式:xml,sqlite,二进制,内存.
遵循NSCoding协议之后,进行归档即可实现复杂对象的存储.

31. 写一个标准宏MIN,这个宏输入两个参数并返回较小的一个.
#define MIN(A,B) (A)>(B)?(B):(A) 
32. iPhone OS 有没有垃圾回收机制,简易阐述一下OC内存管理.

木有.引用计数,ARC和MRC,swift(自动引用计数).

33. 简述应用程序按HOME键进入后台时的生命周期,以及从后台进入前台时的生命周期.
- (void)applicationWillResignActive:(UIApplication *)application 

- (void)applicationDidEnterBackground:(UIApplication *)application 
- (void)applicationWillEnterForeground:(UIApplication *)application 

- (void)applicationDidBecomeActive:(UIApplication *)application 
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
告诉代理进程启动但还没进入状态保存 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
告诉代理启动基本完成程序准备开始运行 

- (void)applicationWillResignActive:(UIApplication *)application 
当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了

- (void)applicationDidBecomeActive:(UIApplication *)application 
当应用程序入活动状态执行,这个刚好跟上面那个方法相反 

- (void)applicationDidEnterBackground:(UIApplication *)application 
当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可 

- (void)applicationWillEnterForeground:(UIApplication *)application 
当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。 

- (void)applicationWillTerminate:(UIApplication *)application 
当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置UIApplicationExitsOnSuspend的键值。 

- (void)applicationDidFinishLaunching:(UIApplication*)application 
当程序载入后执行 

在上面8个方法对应的方法中键入NSLog打印。 
lifeCycle[40428:11303] willFinishLaunchingWithOptions 
lifeCycle[40428:11303] didFinishLaunchingWithOptions 
lifeCycle[40428:11303] applicationDidBecomeActive 
lifeCycle[40428:11303] applicationWillResignActive 
lifeCycle[40428:11303] applicationDidEnterBackground 
lifeCycle[40428:11303] applicationWillEnterForeground 
lifeCycle[40428:11303] applicationDidBecomeActive 
34.ViewControlleralloc,loadView,viewDidLoad,viewWillAppear,viewDidUnload,dealloc,init分别是在什么时候调用?在自定义ViewController的时候这几个函数里面应该做什么工作?
35. 描述应用程序的启动顺序.

a.程序入口main函数创建UIApplication实例和UIApplication代理实例.
b.在UIApplication代理实例中重写启动方法,设置根ViewController
c.在第一ViewController中添加控件,实现应用程序界面.

36. 为什么很多内置类如UITableViewControl的delegate属性都是assign而不是retain?

防止循环引用. 如:对象A引用了对象B,对象B引用了对象C,对象C引用了对象B,这个时候B的引用计数是2,而C的引用计数是1,当A不再使用B的时候,就释放了B的所有权,这个时候C还引用对象B,所以B不会释放,引用计数为1,因为B也引用着对象C,B不释放,那么C也就不会被释放,所以他们的引用计数都为1,并且永远不会被释放,形成了循环引用.

37. .使用UITableView的时候必须要实现的几种方法?

2个数据源方法.分别是:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; 
38. 写一个遍历构造器.
+(id)leftModelWith{ 
    leftModel * model = [self alloc]init]; 

    return model; 
} 
39. UIImage初始化一张图片有几种方法?简述其特点?

3种,

imageNamed:系统会先检查系统缓存中是否有该名字的image,如果有的话,则直接返回,如果没有,则先加载图像到缓存,然后再返回.

initWithContentsOfFile:系统不会检查缓存,而直接从文件系统中记载并返回.

imageWithCGImage:scale:orientation 当scale= 1的时候图像为原始大小,orientation指定绘制图像的方向.

40. person的retainCount值,并解释为什么?
Person * per = [Person alloc]init]; 
self.person = per; 

1或者2.看person是什么类型修饰的. 

alloc+1,assign+0,retain+1.
41. 下面这段代码有何问题?
@implementation Person 
 
- (void)setAge:(int)newAge { 
     
    self.age = newAge; 
     
} 
 
@end 
 
死循环
42. 这段代码有什么问题,如何修改
for (int i = 0; i < someLargeNumber; i++) { 
     
    NSString *string = @”Abc”; 
     
    string = [string lowercaseString]; 
     
    string = [string stringByAppendingString:@"xyz"]; 
     
    NSLog(@“%@”, string); 
     
} 
 
加入自动释放池@autoreleasepool{}; 
 
for (int i = 0; i < someLargeNumber; i++) { 
     
    @antoreleasepool { 
         
        NSString *string = @”Abc”; 
         
        string = [string lowercaseString]; 
         
        string = [string stringByAppendingString:@"xyz"]; 
         
        NSLog(@“%@”, string); 
         
    } 
     
} 
43. 截取字符串"20 | http://www.baidu.com"中,"|"字符前面和后面的数据,分别输出它们
["20 | [http://www.baidu.com](http://www.baidu.com/)" componentSeparatedByString:@"|"];
44. 用obj-c 写一个冒泡排序.
NSMutableArray *ary = [@[@"1", @"2", @"3", @"4", @"6", @"5"] mutableCopy]; 
 
for (int i = 0; i < ary.count - 1; i++) { 
     
    for (int j = 0; j < ary.count - i - 1; j++) { 
         
        if ([ary[j] integerValue] < [ary[j + 1] integerValue]) { 
             
            [ary exchangeObjectAtIndex:j withObjectAtIndex:j + 1]; 
           
        } 
    } 
     
} 
 
NSLog(@"%@", ary);
45. 简述对UIView.UIWindow和CALayer的理解.
46. 写一个完整的代理,包括声明,实现.
代理:遵守协议的对象. 
 
@class MyView; 
 
第一步:指定协议:(协议名:类名+Delegate) 
 
@protocol MyViewDelegate <NSObject> 
 
@required 
 
-(void)changeViewBackgroudColor:(MyView *)view; 
 
@optional 
 
-(void)test; 
 
@end 
 
@interface MyView : UIView 
 
第二步:指定代理 
 
@property (nonatomic,assign)id<MyView> delegate; 
 
@end 
 
第三步:代理遵循协议. 
 
第四步:代理实现协议里面的必须实现的方法和其他可选方法. 
 
第五步:委托方通知代理开始执行方法.
47. 分析json.xml的区别,底层如何实现?

Json:键值对.数据小,不复杂.便于解析,有框架支持,适合轻量级传输.作为数据包个数传输的时候效率更高.

xml:标签套内容.xml数据两较大,比较复杂.适合大数据量的传输.xml有丰富的编码工具,比如:Dom4j,JDom.解析方式有两种,一是通过文芳模型解析,另外一种遍历节点.

48. ViewController的didReceiveMemoryWarning是在什么时候被调用的?

1.当应用程序的内存使用接近系统的最大内存使用时,应用会向系统发送内存警告,这时候系统会调用方法向所有ViewController发送内存警告.
2.打开系统相机.
3.加载高清图片.
默认操作:把里面没有用的对象进行释放.

49. 面向对象的三大特征,简单介绍.

封装:代码模块化,方便以后调用.
继承:子类继承父类的所有方法和属性.
多态:父类指针指向子类对象.

50. 重写一个NSString类型的,retain方式声明name属性的setter和getter方法.

属性的三大特性:语义特性,原子特性,读写特性.

同时重写setter和getter方法,@synchronized name = _name,关联属性和实例变量.

 
- (void)setName:(NSString *)name{ 
     
    if(_name != name){ 
         
        [_name retain]; 
         
        [_name release]; 
         
        _name = name; 
         
    } 
     
} 
 
- (NSString *)name{ 
     
    return [[_name retain]autorelease]; 
     
}
51. 简述NotificationCenter.KVC,KVO,Delegate?并说明它们之间的区别?

NotificationCenter:消息中心.消息通知.

KVC:利用键-值间接访问类中的某个属性.

[self setValue:@"123" forKeyPath:@"name"]; 
 
NSLog(@"%@",[self valueForKeyPath:@"name"]); 

KVO:利用键-路径间接访问类中的某个属性,也就是观察者模式(KVO+通知中心).基于KVC和通知中心,观察的是实例变量.

Delegate:用于多个类之间的传值.

52. 对MVC的理解,好处?

MVC:是一种架构.model:数据处理,view:视图显示,controller:逻辑控制,负责视图和模型之间的通信.
高类聚,低耦合,提高代码的复用性.

53. 监测键盘的弹出.

**通知. **

[[NSNotificationCenter defaultCenter]addObserver:self   selector:@selector()  name:UIKeyboardWillShowNotification  object:nil];
54. 5个ios,sdk库和第三方库.
55. 传值方式:

通知,单例,代理,属性,block.

56. NSString * test = [[NSData alloc] init],test在编译时和运行时分别是什么类型的对象?

编译时是NSString,运行时是NSData.NSData

57. OC中对象的交互是如何实现的?

消息机制.

58. 给定一个字符串,判断字符串中是否还有png,有就删除.

stringContains
使用@""直接替换实现删除

59. 目标-动作机制.

**Target - action **

60. 什么是沙盒?沙盒里包含哪些文件,如何获取文件路径.

沙盒:程序可操作的磁盘空间,系统为之开辟.
包含了3个文件夹.

1.Documents:存放一些比较重要的文件,但是放入Documents中的文件不能过大.

2.Library :是一个资源库,存储一些不太重要的数据.里面包含了两个子文件夹,Caches文件夹,用于缓存,

Preferences文件夹,系统偏好设置,用户对应用程序的设置,如密码.perferences路径无法找到,只能通过NSUserDefaults.

如:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; 
61. 介绍一下XMPP?

基于XML的点对点通讯协议,实现通讯功能.

优点:可以跨平台开发.

缺点:丢包,只能发文字(图片发送发的是链接).

62.应用程序如何省电?

获取请求不能过频.优化算法.

63. 写一个递归方法,计算n的阶乘.
 
-(NSInteger)digui:(NSInteger)i{ 
     
    if (i>0) { 
         
        return i*[self digui:(i-1)]; 
         
    }else{ 
         
        return 1; 
         
    } 
     
} 
 
[[NSUserDefaults standardUserDefaults]setObject:@([self digui:3]) forKey:@"value"]; 
64. 取出一个数组中的重复元素.

1.放进集
2.遍历删除
3.放进字典作为key,再取出key

65. isKindOfClass,isMemberOfClass作用分别是什么?

isKindOfClass是某个类的实例或者子类的实例.
isMemberOfClass是某个类的实例

66. 请分别写出SEL,id的意思?

SEL:选择器.
id:范类型
OC中的对象就是C语言的指针.

67. iPhone上,能被应用程序直接调用的系统程序是什么?

能:相册,相机,通讯录,音乐.

不能:计算器,天气,日历,指南针.

68. 说说后台如何运行程序.
在plist配置Application does not run in background设置NO(默认就是NO)的前提下. 

添加required background modes,值是App registers for location updates和App plays auto or streams audio/video using AirPlay 
69. sizeof和strlen的区别和联系?

sizeof:占用空间大小.
strlen:字符串大小.

70. sprintf,strcpy,memcpy的功能?使用上要注意哪些地方?

sprintf:将某些类型转换成字符串类型
strcpy:拷贝字符串,会越界,'/0'
memcpy:拷贝内存

71. 写一个函数实现strlen的功能?
int sl(const char *s) 
 
{ 
     
    int length = 0; 
     
    while (*s!='') { 
         
        s++; 
         
        length++; 
         
    } 
     
    return length; 
     
} 
72. 写一个代码片实现输入一个字符串"20130322152830",输出一个NSDate类型的对象,打印该对象输出2013-03-11 15:28:32
NSString * str = @"20130322152832"; 
 
NSDateFormatter * format = [[NSDateFormatter alloc]init]; 
 
format.dateFormat = @"yyyyMMddHHmmss";//设置格式 
 
NSLog(@"%@",[[format dateFromString:str] dateByAddingTimeInterval:8*60*60]); 
73. cocoa和 cocoa touch?

cocoa包含Foundation和AppKit框架,可用于开发Mac OS X系统的应用程序
cocoa touch包含Foundation和UIKit框架,可用于开发iPhone OS 系统的应用程序
Cocoa时Mac OS X的开发环境,cocoa Touch是 Iphone OS的开发环境

74. 网络从下往上分为几层?

从下往上:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

IP 协议对应网络层,TCP 协议对应传输层,HTTP 协议对应于应用层。

socket 则是对 TCP/IP协议的封装和应用。也可以说,TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而 HTTTP 是应用层协议,主要解决

75. 多线程的底层实现?

线程:进程中一个特立独行的控制单元(路径)。多线程:一个进程至少有一个线程,即主线程。

①、Mach 是第一个以多线程方式处理任务的系统,因此多线程的底层实现机制就是基于 Mach 的线程。
②、开发中很少用到 Mach 级的线程,因为 Mach级的线程没有提供多线程的基本特征,线程之间是独立的。
️、开发中实现多线程的方案:
NSThread、GCD、NSOperationQueue.NSOperation

76. 线程之间怎么通信?

①.performSelect:onThread:withObject:waitUntilDone:
②.NSMachPort

77. 网络图片问题中怎么解决一个相同的网络地址重复请求的问题.

利用字典:图片地址为 key, 下载操作为 value.value

78. 用 NSOperation和 NSOperationQueue处理 A.B.C三个线程,要求执行完 A.B 后才能执行?
 
//创建队列 
 
NSOperationQueue * queue = [[NSOperationQueue alloc]init]; 
 
//创建三个操作 
 
NSOperation * A = [NSBlockOperation blockOperationWithBlock:^{ 
     
    NSLog{@"A"}; 
     
}]; 
 
NSOperation * B = [NSBlockOperation blockOperationWithBlock:^{ 
     
    NSLog{@"B"}; 
     
}]; 
 
NSOperation * C = [NSBlockOperation blockOperationWithBlock:^{ 
     
    NSLog{@"C"}; 
     
}]; 
 
// 添加依赖 
 
[C addDependency:a]; 
 
[C addDependency:b]; 
 
//执行操作 
 
[queue addOperation:a]; 
 
[queue addOperation:b]; 
 
[queue addOperation:c]; 
79. GCD内部怎么实现的?

①.iOS和 OSX 的核心是 XNU 内核, GCD是基于 XNU 内核实现的(是由苹果电脑发展起来的操作系统内核).
②.GCD 的 API 全部在 libdispatch 库中.
③.GCD 底层实现主要有 Dispatch Queue(管理 block)和 Dispatch Source(处理事件).

80. 怎么保证多人开发进行内存泄露检查。

使用Analuze进行代码的静态分析,为避免麻烦,多人开发尽量使用ARC.

81. 非自动内存管理情况下怎么做单例模式。

创建一个单例对象的静态实例,并初始化为nil。
创建一个类的类工厂方法,当且仅当这个类的实例为nil时生成一个类的实例。
实现NScopying协议,覆盖allocWithZone:方法,确保用户在直接分配对象时,不会产生另一个对象。
覆盖release、autorelease、retain、retainCount方法,确保单例的状态。

82. 对于类方法(静态方法)默认是autorelease的,所有类方法都会这样吗?

系统自带的绝大数类方法返回的对象,都是经过autorelease.

83. block在ARC中和MRC中的方法有何区别?需要注意什么?

①.对于没有引用外部变量的Block,无论在ARC还是MRC下,类型都是NSGlobalBlock,这种类型的block可以理解为一种全局的block,不需要考虑作用域的问题。同时,对它进行Copy和Retain操作也是无效的。

②.避免循环引用。
根据isa指针,block一共有3种类型的block
_NSConcreteGlobalBlock 全局静态
_NSConcreteStackBlock 保存在栈中,出函数作用域就销毁
_NSConcreteMallocBlock 保存在堆中,retainCount == 0销毁

84. 什么情况下会发生内存泄露和内存溢出?

当程序在申请内存后,无法释放已经申请的内存空间(例如一个对象或者变量在用完后没有释放,这个对象就一直占用着内存),一次内存泄露可以忽略,但如果泄露过多的话,就会造成内存溢出。

当程序在申请内存时,但存入了更大的数据,出现内存溢出。

85. [NSArray arrayWithobject<id>]这个方法添加对象后,需要对这个数组进行释放操作吗?

不需要,这个对象会被放到自动释放池中。

86. 自动释放池如何实现?

自动释放池以栈的形式实现,当你创建一个新的自动释放池时,它将被添加到栈顶,当一个对象收到发送autorelease消息时,它将添加到当前线程的处于栈顶的自动释放池中,当自动释放池被回收时,它们从栈中被删除并且会给池子里所有对象都做一次release操作。

87. KVO内部实现原理?

①.KVO是基于runtime机制实现的。

②.当某个类的对象第一次被观察时,系统就会在运行期动态的创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter方法。

派生类在被重写setter方法中实现了真正的通知机制。(Person->NSKVONotification Person)

88. 能否把比较耗时的操作放在NSNotificationCenter中。

如果在异步线程发出的通知,那么就可以把耗时操作放到NSNotificationCenter
如果在主线程发的通知,那么就不可以把耗时操作放到NSNotificationCenter中。

89. Foundation对象与Core Foundation对象有何区别?

Foundation对象是OC的,Core Foundation对象是C对象。
数据类型之间的转换:
** ARC:** _bridge_retained、_bridge_transfer
** 非ARC:** _bridge

90. 不用第三变量,交换AB的值。
A=A+B 
 
B=A-B 
 
A=A-B 

或者

 
A=A^B 
 
B=A^B 
 
A=A^B 
91. 简单描述下对单例模式设计的理解?

节省内存资源,一个应用就一个对象。

92. runtime实现的机制是什么?怎么用,一般用于干嘛。

运行时机制,runtime库里面包含了跟类、成员变量、方法相关的API,比如获取类里面的所有成员变量,为类动态添加成员变量、动态改变类的方法实现,为类动态添加新的方法等,需要导入<objc/message.h><objc/message.h>
①.runtime,运行时机制,它是一套C语言库。
②.实际上我们编写的所有OC代码,最终都是转换成为了runtime库的东西,比如类转换成了runtime库里面的结构体等数据类型,方法转换成了runtime库里面的C语言函数,平时调方法都是转成了objc_msgSend函数(所以说OC有个消息发送机制)
③、因此,可以说runtime是OC的底层实现,是OC的幕后执行者。
④、有了runtime库,能做什么呢?可以获取类里面的所有成员变量、为类动态的添加成员变量、动态的改变类的方法实现、为类动态添加新的方法等等。

93. 是否使用Core Text 或者 Core Image ?

Core Text
随意修改文本的样式
图文混排(纯C语言)

Core Image(滤镜处理)
能够调节图片的各种属性(对比度、色温、色差等)

94. NSNotification和KVO的区别和用法是什么?什么时候应该使用通知,什么时候应该使用KVO,他们的实现有何区别?如果用protocol和delegate来实现类似的功能可能吗?可能的话有何问题?不可能的话why?

通知比较灵活,一个通知能被多个对象接受,一个对象可以接受多个通知。
代理不交规范,但是代码较多(默认是一对一)
KVO性能不好(底层会产生新的类),只能监听某个对象属性的变化,不推荐使用。

95. 怎么解决缓存池满的问题?

iOS中不存在缓存池满的情况,通常在对象需要创建时才创建,比如UITableView中一般只会创建刚开始在屏幕中的cell,之后都是从缓存池里取,不会再创建新对象

96. 控制器View的生命周期及相关函数是什么?你在开发中是如何使用的?

1、首先判断控制器是否有视图,如果没有就调用loadView方法创建:通过storyBoard或者代码。
2、随后调用viewDidLoad,可以进行下一步的初始化操作,只会被调用一次。
3、在视图显示之前调用viewWillAppear,该函数可以多次调用。
4、视图viewDidAppear
5、在布局变化前后,调用viewWill/DidLayoutSubViews处理相关信息。

97. 有些图片加载比较慢怎么处理?你是怎么优化程序的性能的?

①、图片下载放在异步线程。
②、图片下载过程使用占位图片。
③、如果图片比较大,可以使用多线程断点下载。

98. App需要加载大量数据,给服务器发送请求,但是服务器卡住了怎么办?

设置请求超时,给用户提示请求超时,根据用户操作再次请求。

99. SDWebImage具体如何实现?

其实就是沙盒缓存机制,主要由三块组成:内存图片缓存,内存操作缓存,磁盘沙盒缓存。
①、利用NSOperationQueue和NSOperation下载图片,还使用了GCD(解析GIF图片)。
②、利用URL作为key,NSOperation作为value.
③、利用URL作为key,UIImage作为value

100. AFNetWorking实现原理。

基于NSURL.采用block的方法处理请求,直接返回的是json、XML数据。AFN直接操作对象是AFHTTPClient,是一个实现了NSCoding和NSCopying协议的NSObject子类。AFGTTPClient是一个封装了一系列操作方法的工具类。AFN默认没有封装同步请求,如果开发者需要使用同步请求,需要重写相关的方法(getPath:parameters:failure),对AFHTTPRequestOperation进行同步处理。

101. 什么是响应链,它是怎么工作的?

http://www.jianshu.com/p/9179e5d780c8
有两种方法可以访问私有属性,一种是通过KVC获取,一种是通过runtime访问并修改私有属性
创建一个Father类,声明一个私有属性name,并重写description打印name的值,在另外一个类中通过runtime来获取并修改Father中的属性

@interface Father () 
@property (nonatomic, copy) NSString *name; 
@end 
@implementation Father 
 
- (NSString *)description 
{ 
    return [NSString stringWithFormat:@"name:%@",_name]; 
} 
 
@implementation ViewController 
 
- (void)viewDidLoad { 
     
    [super viewDidLoad]; 
     
    Father *father = [Father new]; 
    // count记录变量的数量IVar是runtime声明的一个宏 
    unsigned int count = 0; 
    // 获取类的所有属性变量 
    Ivar *menbers = class_copyIvarList([Father class], &count); 
     
    for (int i = 0; i < count; i++) { 
        Ivar ivar = menbers[i]; 
        // 将IVar变量转化为字符串,这里获得了属性名 
        const char *memberName = ivar_getName(ivar); 
        NSLog(@"%s",memberName); 
         
        Ivar m_name = menbers[0]; 
        // 修改属性值 
        object_setIvar(father, m_name, @"zhangsan"); 
        // 打印后发现Father中name的值变为zhangsan 
        NSLog(@"%@",[father description]); 
    } 
     
} 
102. iOS Extension 是什么?能列举几个常用的 Extension 么?

Extension是扩展,没有分类名字,是一种特殊的分类,类扩展可以扩展属性,成员变量和方法
常用的扩展是在.m文件中声明私有属性和方法,这里不知道还哪些,请大家补充

如何把一个包含自定义对象的数组序列化到磁盘?

自定义对象只需要实现NSCoding协议即可

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
     
    User *user = [User new]; 
    Account *account = [Account new]; 
    NSArray *userArray = @[user, account]; 
    // 存到磁盘 
    NSData * tempArchive = [NSKeyedArchiver archivedDataWithRootObject: userArray]; 
} 
// 代理方法 
- (instancetype)initWithCoder:(NSCoder *)coder 
{ 
    self = [super initWithCoder:coder]; 
    if (self) { 
        self.user = [aDecoder decodeObjectForKey:@"user"]; 
        self.account = [aDecoder decodeObjectForKey:@"account"]; 
    } 
    return self; 
} 
// 代理方法 
-(void)encodeWithCoder:(NSCoder *)aCoder{ 
    [aCoder encodeObject:self.user forKey:@"user"]; 
    [aCoder encodeObject:self.account forKey:@"account"]; 
} 
103. iOS 的沙盒目录结构是怎样的? App Bundle 里面都有什么?

沙盒结构
Application:存放程序源文件,上架前经过数字签名,上架后不可修改
Documents:常用目录,iCloud备份目录,存放数据,这里不能存缓存文件,否则上架不被通过
Library
Caches:存放体积大又不需要备份的数据,SDWebImage缓存路径就是这个
Preference:设置目录,iCloud会备份设置信息
tmp:存放临时文件,不会被备份,而且这个文件下的数据有可能随时被清除的可能

104. App Bundle 里面有什么

Info.plist:此文件包含了应用程序的配置信息.系统依赖此文件以获取应用程序的相关信息
可执行文件:此文件包含应用程序的入口和通过静态连接到应用程序target的代码
资源文件:图片,声音文件一类的
其他:可以嵌入定制的数据资源

105. iOS 的签名机制大概是怎样的?

假设,我们有一个APP需要发布,为了防止中途篡改APP内容,保证APP的完整性,以及APP是由指定的私钥发的。首先,先将APP内容通过摘要算法,得到摘要,再用私钥对摘要进行加密得到密文,将源文本、密文、和私钥对应的公钥一并发布即可。那么如何验证呢?
验证方首先查看公钥是否是私钥方的,然后用公钥对密文进行解密得到摘要,将APP用同样的摘要算法得到摘要,两个摘要进行比对,如果相等那么一切正常。这个过程只要有一步出问题就视为无效。
iOS 7的多任务添加了哪两个新的 API? 各自的使用场景是什么?

后台获取(Background Fetch):后台获取使用场景是用户打开应用之前就使app有机会执行代码来获取数据,刷新UI。这样在用户打开应用的时候,最新的内容将已然呈现在用户眼前,而省去了所有的加载过程。
推送唤醒(Remote Notifications):使用场景是使设备在接收到远端推送后让系统唤醒设备和我们的后台应用,并先执行一段代码来准备数据和UI,然后再提示用户有推送。这时用户如果解锁设备进入应用后将不会再有任何加载过程,新的内容将直接得到呈现。

106. NSOperation 相比于 GCD 有哪些优势?

提供了在 GCD 中不那么容易复制的有用特性。
可以很方便的取消一个NSOperation的执行
可以更容易的添加任务的依赖关系
提供了任务的状态:isExecuteing, isFinished.

107. strong / weak / unsafe_unretained 的区别?

weak只能修饰OC对象,使用weak不会使计数器加1,对象销毁时修饰的对象会指向nil
strong等价与retain,能使计数器加1,且不能用来修饰数据类型
unsafe_unretained等价与assign,可以用来修饰数据类型和OC对象,但是不会使计数器加1,且对象销毁时也不会将对象指向nil,容易造成野指针错误

108. 如何为 Class 定义一个对外只读对内可读写的属性?

在头文件中将属性定义为readonly,在.m文件中将属性重新定义为readwrite
Objective-C 中,meta-class 指的是什么?

meta-class 是 Class 对象的类,为这个Class类存储类方法,当一个类发送消息时,就去那个类对应的meta-class中查找那个消息,每个Class都有不同的meta-class,所有的meta-class都使用基类的meta-class(假如类继承NSObject,那么他所对应的meta-class也是NSObject)作为他们的类

109. UIView 和 CALayer 之间的关系?

UIView显示在屏幕上归功于CALayer,通过调用drawRect方法来渲染自身的内容,调节CALayer属性可以调整UIView的外观,UIView继承自UIResponder,CALayer不可以响应用户事件
UIView是iOS系统中界面元素的基础,所有的界面元素都继承自它。它内部是由Core Animation来实现的,它真正的绘图部分,是由一个叫CALayer(Core Animation Layer)的类来管理。UIView本身,更像是一个CALayer的管理器,访问它的根绘图和坐标有关的属性,如frame,bounds等,实际上内部都是访问它所在CALayer的相关属性
UIView有个layer属性,可以返回它的主CALayer实例,UIView有一个layerClass方法,返回主layer所使用的类,UIView的子类,可以通过重载这个方法,来让UIView使用不同的CALayer来显示

110. frame 和 bounds 的区别是什么?

frame相对于父视图,是父视图坐标系下的位置和大小。bounds相对于自身,是自身坐标系下的位置和大小。
frame以父控件的左上角为坐标原点,bounds以自身的左上角为坐标原点

111.如何把一张大图缩小为1/4大小的缩略图?

let data = UIImageJPEGRepresentation(image, 0.25)

上一篇 下一篇

猜你喜欢

热点阅读