1 A.clang warning
2 #pragma clang diagnostic push
3 #pragma clang diagnostic ignored "-Wgnu"
4 //code
5 #pragma clang diagnostic pop
6
7 表示在这个区间里忽略一些特定的clang的编译警告,因为AFNetworking作为一个库被其他项目引用,所以不能全局忽略clang的一些警告,只能在有需要的时候局部这样做,作者喜欢用?:符号,所以经常见忽略-Wgnu警告的写法
8
9 dispatch_once
10 为保证线程安全,所有单例都用dispatch_once生成,保证只执行一次,这也是iOS开发常用的技巧。例如:
11 static dispatch_queue_t url_request_operation_completion_queue() {
12 static dispatch_queue_t af_url_request_operation_completion_queue;
13 static dispatch_once_t onceToken;
14 dispatch_once(&onceToken, ^{
15 af_url_request_operation_completion_queue = dispatch_queue_create("com.alamofire.networking.operation.queue", DISPATCH_QUEUE_CONCURRENT );
16 });
17 return af_url_request_operation_completion_queue;
18 }
19
20 C.weak & strong self
21 常看到一个 block 要使用 self,会处理成在外部声明一个 weak 变量指向 self,在 block 里又声明一个 strong 变量指向 weakSelf:
22 __weak __typeof(self)weakSelf = self;
23 self.backgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^{
24 __strong __typeof(weakSelf)strongSelf = weakSelf;
25 }];
26 weakSelf是为了block不持有self,避免循环引用,而再声明一个strongSelf是因为一旦进入block执行,就不允许self在这个执行过程中释放。block执行完后这个strongSelf会自动释放,没有循环引用问题。