概述
AFHTTPSessionManager 继承自 AFURLSessionManager,它是对 AFURLSessionManager 里的方法进行了二次封装,使用时更加便捷,是网络请求最常用的类。
AFHTTPSessionManager
下面是 AFHTTPSessionManager 引用的类:
.h 文件
|
|
.m 文件
|
|
类库介绍
SystemConfiguration
TargetConditionals
“Target Conditionals” 目标条件,是由 Apple 提供的,内部定义了多种方便的宏代码。如果要使用内部的一些宏,就需要导入 \
- TARGET_OS_IOS
- TARGET_OS_WATCH
- TARGET_OS_TV
还有几个有趣的宏:
- TARGET_IPHONE_SIMULATOR
- TARGET_OS_MAC
- TARGET_OS_IPHONE
这里需要注意的是 iPhone OS 是 Mac OS 演变过来的子系统,所以当运行在手机系统上时,TARGET_OS_MAC 也会被定义。这个时候,如果想限制代码只包含在手机系统上时,可以使用 TARGET_OS_IPHONE,相应的只包含在 Mac 系统上使用 #if !TARGET_OS_IPHONE。
Availability
Security
netinet/in.h
netinet6/in6.h
arpa/inet.h
ifaddrs.h
netdb.h
AFURLSessionManager 是网络请求类。主要做了两件事,一是创建 NSURLSession 对象并实现相应的代理方法;二是创建 NSURLSessionDataTask 对象并管理;
AFURLRequestSerialization 是序列化请求数据类。它会将请求数据进行序列化后生成一个 NSMutableURLRequest 对象,用于创建 NSURLSessionDataTask 对象;
- AFURLResponseSerialization 是序列化返回结果类。它会将服务器返回的数据进行序列化后,返回给开发者。
AFHTTPSessionManager 中实现的 GET、HEAD、POST、PUT、PATCH、DELETE 等方法,都是基于下面的这个私有方法。下面的这个方法会根据传入的 method 来区分具体实现的方法。
|
|
以上描述也可以简单的概括为:
- AFHTTPSessionManager 通过 AFURLRequestSerialization —> request
- AFHTTPSessionManager 通过 AFURLSessionManager + request —> dataTask
- AFHTTPSessionManager 通过 AFURLResponseSerialization —> 序列化后的请求结果
知识点梳理
#pragma
#pragma 声明主要由 Xcode 用来完成两个主要任务:整理代码和防止编译器警告。通过使用#pragma clang diagnostic push/pop,你可以告诉编译器仅仅为某一特定部分的代码(最初的诊断设置在最后的pop被恢复)来忽视特定警告。
这里的 #pragma clang diagnostic ignored “-Wgnu” 就是用来忽略警告的。
|
|
block
对象 dataTask 在被 __block 修饰后,会生成一个结构体,里面记录了 dataTask 对象的地址。当 block 的函数体内部调用 dataTask 时,该结构体会作为 block 实例内的一个变量被 block 函数体记录。由于记录的是 dataTask 对象的地址,所以在函数体内部可以对其进行修改,同样的,在外部被修改时,函数体内部的 dataTask 也会被修改,毕竟它们访问的是同一个地址。
|
|
可以用 clang -rewrite-objc 命令查看它的 c++ 实现:
|
|
在 block 变量结构体内部有这样一句代码,它表示了该 block 的类型:
|
|
_NSConcreteStackBlock:(栈区)
只用到外部局部变量、成员属性变量,且没有强指针引用的block都是StackBlock。
StackBlock的生命周期由系统控制的,一旦返回之后,就被系统销毁了。_NSConcreteMallocBlock:(堆区)
有强指针引用或copy修饰的成员属性引用的block会被复制一份到堆中成为MallocBlock,没有强指针引用即销毁,生命周期由程序员控制_NSConcreteGlobalBlock:(全局)
没有用到外界变量或只用到全局变量、静态变量的block为_NSConcreteGlobalBlock,生命周期从创建到应用程序结束。
NSSecureCoding
NSSecureCoding 是在 iOS 6 / OS X Mountain Lion SDKs 里推出的协议。如果一个类符合 NSSecureCoding 协议并在 supportsSecureCoding 返回 YES,就声明了它可以处理本身实例的编码解码方式,以防止替换攻击。
NSSecureCoding 和 NSCoding 的区别在于解数据时要指定 Class,用 decodeObjectOfClass:forKey: 方法代替了 decodeObjectForKey:。这样做更安全,因为序列化后的数据有可能被篡改,若不指定 Class,decode 出来的对象可能不是原来的对象,有潜在风险。
NSParameterAssert
基础类库中定义了两套断言宏:
基础类库从语义学上和功能性上使断言处理器的 API 在两个方面区别开来。
第一个区别在于一般断言(NSAssert)和参数化断言(NSParameterAssert)。
第二个区别在于 C 和 Objective-C 的断言:NSAssert 应当只用于 Objective-C 环境中(即方法实现中),而 NSCAssert 应当只用于 C 环境中(即函数中)。
NSAssertionHandler:自定义处理方法,程序不会直接崩溃。
- 当 NSAssert 或 NSParameterAssert 的条件不满足时,断言处理器会调用
-handleFailureInMethod:object:file:lineNumber:description: 方法。 - 当 NSCAssert 或 NSCParameterAssert 的条件不满足时,断言处理器会调用
-handleFailureInFunction:file:lineNumber:description: 方法。
NSAssert/NSParameterAssert 两者的区别是前者是所有断言, 后者只是针对参数是否存在的断言。
PS : Xcode 已经默认将 release 环境下的断言取消了, 避免了忘记关闭断言造成的程序不稳定。