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