iOS章结 - 知道 \12
1 – 面向对象是 90 年代软件开发方法的主流,是一种设计思路,它已经扩展到很宽的范围,如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、人工智能、CAD技术等领域
2 – 初始化方法命名一般是以 init 开头,其返回值只能是 id 类型或本类对象,不能是 void。一个类可以有多种初始化方法但有且只有一个指定的初始化方法
3 – 单例模式是一种软件设计模式,在使用时,单例对象的类必须保证只有一个实例存在。它的思路是:一个类只能返回对象的一个引用(永远是同一个)和一个获得该实例的方法
4 – SEL 只是方法编号;IMP 是一个函数指针,保存了方法的地址。每一个继承于 NSObject 的类都能自动获得 runtime 的支持。在一个类中有一个 isa 指针,指向该类定义的数据结构体,在这个结构体中包括了指向其父类的指针以及 Dispatch table,Dispatch table 是一张 SEL 和 IMP 的对应表,就是说方法编号 SEL 最后还是要通过 Dispatch table 表寻找到对应的 IMP,IMP 就是一个函数指针,然后执行这个方法
5 – 野指针:对象被回收,但仍有指针指向这块内存
6 – 程序崩溃的原因,内存问题占了 90%+,主要表现为:野指针异常、内存溢出
7 – 直接赋值(assign):适用于基本数据类型,包括结构体和枚举;引用赋值(持有赋值):适用于源对象和被赋值对象需要同时修改的时候;拷贝赋值:适用于源对象不受影响,而被赋值对象需要修改的时候
8 – OC 可以使用 GCC 和 Clang 编译器进行编译
9 – OC 语言的应用环境:(1)iOS 应用程序/系统(2)Mac OS X 应用程序/系统
10 – block 相关
① block 是 C语言的扩充功能,一句话准确概括:带有自动变量值(局部变量)的匿名函数(带有自动变量值在 block 中表现为截获自动变量的值)
② block 类型变量和一般的 C语言变量完全相同,可以作以下用途:(1)自动变量(2)函数参数(3)静态变量(4)静态全局变量(5)全局变量
③ block 不管配置在何处(堆、栈或者全局),使用 copy 方法都不会引起任何问题,在不确定时调用 copy 即可
④ 在 ARC 模式下,编译器不能自行把 block 优化到堆区的状况
向方法或函数的参数中传递 block 时(方法或函数不需要手动复制 block,编译器自动将 block 分配到堆区)
cocoa 框架的方法且方法名中含有 usingBlock 等时,例如在使用 NSArray 类的 enumerateObjectsUsingBlock 实例方法以及 dispatch_async 函数时
GCD 的 API
将 block 赋值给附有 __strong 修饰符 id 类型的类或 block 类型成员变量时
block 作为函数的返回值返回时
11 – ARC 机制下可以使在栈上分配的指针隐式的初始化为 nil,如下
- (void)myMethod{ NSString *name;// 野指针 NSLog(@"name is %@",name);// 在 ARC 里程序运行会打印出 name:NULL,而 MRC 中会使程序崩溃 }
12 – 同步和异步的区别之一就是:同步在当前线程中执行,不具备开启新线程的能力;异步在另一条线程中执行,具备开启新线程的能力
13 – 什么是预编译、何时要用到它
① 它是指程序运行前的一些预处理工作,主要是指 # 表示
② 当总是使用不经常改动的大型代码体时或者当程序是由多喝模块组成、所有模块都使用一组标准的包含文件或相同的编译选项时,需要使用到预编译
14 – 说说如何进行后台运行程序
① 其实就是判断是否支持多线程
1 UIDevice *device = [UIDevice currentDevice]; 2 BOOL backgroundSupported = NO; 3 if ([device respondsToSelector:@selector(isMultitaskingSupported)]){ 4 backgroundSupported = device.multitaskingSupported; 5 }
声明你需要的后台任务:在 Info.plist 中添加 UIBackgroundModes 键值,它包含一个或多个 string 的值。包括 audio: 在后台提供声音播放功能、包括音频流和播放视频时的声音、location: 在后台可以保持用户的位置信息、voip:在后台使用 VOIP 功能……总之前面的每个 value 会让系统知道你的应用程序在适当的时候被唤醒
② 除了添加键值的方法 iOS 还提供了两种途径使应用程序在后台工作
Task completion: 应用程序可以向系统申请额外的时间去完成给定的任务
Local notifications:应用程序可以预先安排时间执行 local notifications 传递实现长时间的后台任务,应用程序可以请求在后台运行以实现特殊的服务。注:这些应用程序并不连续的运行,但是会被系统框架在合适的时间唤醒,以实现这些服务
15 – ASIDownloadCache 配置下载缓存( ASIHTTPRequest 是一个对 CFNetwork API 进行了封装,并且使用起来非常简单的一套 API,它用 Objective-C 编写)
① 比如我们对 Get 请求的响应数据进行缓存
[ASIHTTPRequest setDefaultCache:[ASIDownloadCache sharedCache]];
当设置缓存策略后,所有的请求都被自动的缓存起来。如果仅仅希望某次请求使用缓存操作,可以这样
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDownloadCache:[ASIDownloadCache sharedCache]];
② 缓存存储方式:可以设置缓存的数据需要保存多长时间。ASIHTTPRequest 提供了两种策略
// 默认策略,基于 session 的缓存数据存储 ASICacheForSessionDurationCacheStoragePolicy // 当下次运行或 [ASIHTTPRequest clearSession] 时缓存将失效 // 把缓存数据永久保存在本地 ASICachePermanentlyCacheStoragePolicy
代码示例
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];