iOS冷知识汇总
Contents
前言
本文主要收录iOS开发的一些冷知识(不定期更新)
dispatch_after 是延时入队,不是延时执行
假设队列中间休眠了4秒,dispatch_after 的时间为2秒;
则dispatch_after 里的内容会在6秒后才执行,而不是2秒后执行。
要正确理解 延时入队 及 延时执行 的概念。
验证代码如下:
1  | dispatch_queue_t queue = dispatch_queue_create("xyz.aevit.gcd.after", DISPATCH_QUEUE_SERIAL);  | 
运行结果:
环境:OS X 10.11.5 / Xcode 7.3.1 (7D1014) / iPhone Simulator iPhone 6s Plus

nil、Nil、NULL、NSNull 的区别
nil:指向一个对象的指针为空,如: NSString _name = nil;Nil:指向一个类的指针为空,如: Class aClass = Nil;NULL:指向C类型的指针为空, 如: int_pInt = NULL;NSNull:在 Objective-C 中是一个类,只是名字中有个Null,多用于集合(NSArray,NSDictionary)中值为空的对象
禁止程序运行时自动锁屏
1  | [[UIApplication sharedApplication] setIdleTimerDisabled:YES];  | 
CocoaPods慢的问题
1  | pod install --verbose --no-repo-update  | 
如果不加后面的参数,默认会升级CocoaPods的spec仓库,加一个参数可以省略这一步,然后速度就会提升不少
dispatch_group 添加任务
分为2种情况:
1、能获取到 queue变量(如自己创建的队列):使用 dispatch_group_async 即可:
1  | dispatch_group_async(group, queue, ^{  | 
2、无法获取到 queue变量:使用 dispatch_group_enter dispatch_group_leave:
如 AFNetworking 的队列:
1  | AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  | 
PS:如果要把一个异步任务加入到 group ,以下写法是不行的:
1  | dispatch_group_async(group, queue, ^{  | 
需要这样写:
1  | dispatch_group_enter(group);  | 
dispatch_group 为 AFNetworking 实现同步任务
1  | dispatch_group_t group = dispatch_group_create();  | 
数组按某个 key 重新分组
假设有这样的数组:
1  | NSArray *originArray = @[  | 
要按 gender 这个键对应的值重新分组成如下结构(即值为 male 的归为一组,female 的归为另一组):
1  | @[  | 
可以使用如下方法:
1  | - (NSArray*)reGroupArray:(NSArray*)array withFieldName:(NSString*)fieldName {  | 
像这样使用即可:
1  | NSArray *finalArr = [self reGroupArray:originArray withFieldName:@"gender"];  | 
PS:如果只是要取出指定值的数据(如取出全部 gender == male 的数据),可以使用正则:
1  | NSArray *malesArr = [originArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"gender = %@", @"male"]];  | 
ATS 调试
在
Edit Scheme的Run里添加环境变量CFNETWORK_DIAGNOSTICS = 1,之后看控制台里的输出,会将网络请求(非常详细)写入一个文件里使用
nscurl命令,后面跟着要调试的网址,之后会列出NSAllowsArbitraryLoads、NSExceptionMinimumTLSVersion等的设置结果(PS:可在下面命令后面加上> ~/Desktop/ats.txt将内容输出到文件里) ,用法示例:
1  | /usr/bin/nsurl --ats-diagnostics --verbose https://baidu.com  | 
使用苹果的
TLSTool(不过只能在Xcode 7编译…),用法示例:./TLSTool s_client -connect www.baidu.com:443 GET / HTTP/1.1 Host: www.baidu.com
LLDB
watchpoint set v {obj_name}: 设置观察点call (void)instrumentObjcMessageSends(YES): 打印出所有运行时发送的消息(存在 /tmp/msgSend-xxxx 位置)
