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 位置)
