前言
分享iOS开发中遇到的问题,和相关的一些思考。
正文
Xcode适配问题
1、GPUImage在Xcode 10/11编译失败
GPUImage的framework/Source目录下,有iOS和Mac两个文件夹,在iOS的工程中include了Mac文件夹的代码,会产生编译错误;将Mac文件夹去掉即可解决。
该问题在低版本的Xcode不会出现。
2、'set' file not found
该问题出现在xcode 11,STL相关类vector、string、queue等都无法识别并且报错,并且写代码没有索引提示; 修复方式选择下面两个C 的编译选项:
3、nullable警告过多
nullable的warning遍地飞,对于开启warning as error的工程简直噩梦,可以增加下面的设置:
Build Settings -> Custom compiler flags -> Other Warning Flags
最好还是按照要求,添加是否nullable的声明,在编译期间发现问题。
4、清空模拟器的keychain
有业务场景需要,需要清除某个库的存储信息,但是该信息存在keychain,即使卸载重装也无法清除。
此时可以找到模拟器的keychain数据库,手动删除。
-/Users/loyinglin/Library/Developer/CoreSimulator/Devices/F6399AD7-AC6F-4F4E-B7C1-01E0D88A34A0/data/Library/Keychains
目录下,keychain-2-debug.db
这个db文件。
另外reset模拟器也可以,但是耗时比更长。
Objective-C相关
1、NSString的length字符长度和C 中的string的length字符长度
NSString的length是字符长度,以UTF16来表示,比如说中文字符,@"中文字符"
,length=4;
C 中的string的length是字符串长度,比如说"abc"
,length=3;
所以想要判断某个NSString的字符串长度,或者去获取某个特定的字符,用-characterAtIndex:
方法获取到的是某个unichar的字符(就是unsign short,UTF16的字符),而用- (nullable const char *)cStringUsingEncoding:(NSStringEncoding)encoding;
可以转换成char*字符串;
2、NSKeyedUnarchiver偶现NSException
NSKeyedUnarchiver有时候在解压的时候会出现下面的异常:
代码语言:javascript复制NSException-[NSKeyedUnarchiver initForReadingWithData:]: incomprehensible archive (0x62, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x30, 0x30)
Thread 0 name: Dispatch queue: com.apple.main-thread
initForReadingWithDataAPI的接口描述中,有一句:This method throws an exception if data is not a valid archive.
所以是需要添加TRY&CATCH的,也可以改用ProtocolBuffer来解决;
实际应用中,我们大部分数据的本地序列化都改成了PB,效率提升比较明显。
3、iOS 13 开启辅助功能导致的卡死
起初是某个特定机器在进入某个页面时会出现卡死,后面经过排查和定位,发现是iOS的辅助朗读功能引起死循环,卡死的堆栈如下:
排查代码后发现,某个界面的实现带有了一个指向self的weak属性,而辅助朗读的功能会遍历view里面所有的属性,导致了这一次死循环; 解决方案是去掉该指向self的weak属性。(即使是weak,指向自己也是不应该出现的;另外这种写法虽然不规范,但不应该出现死循环,相信后续的iOS版本会修复)
4、 premain函数的方法
最近发现有同事使用下面的这个方法:
代码语言:javascript复制static void __attribute__((constructor(0))) _mainConstructor() {
}
经过了解,这是声明一个在main函数入口之前执行的函数(优先级为0),这个函数的执行是在main函数之前;
__attribute__((constructor)):
被修饰的函数在main函数之前调用
__attribute__((destructor)):
被修饰的函数在main函数之后调用
这里的业务场景是为了获取启动耗时,在main函数之前之前打个点。
参考链接
Mac 相关
1、中文输入法切换失败
偶尔输入法会出现无法切换的情况,此时可以打开 Activity Monitor,杀掉 TISwitcher 这个进程。
解决方案源于这里。
2、SourceTree输入错误密码
某次从GitHub拉取代码的时候,不小心填错了密码,结果找遍sourceTree都没发现修改的地方; 最后才发现密码保存在钥匙串;
处于安全的考虑,把密码存在钥匙串是合理的。
3、charles进行map local数据异常
最近charles出现异常情况,抓包正常,部分接口map local数据正常,部分出现下面的异常:
经过排查,发现部分接口map local成功,部分接口会失败,失败的接口有json文件比较大的情况。
看错误信息,Failure的原因是 Client closed connection before receiving entire response
。
经过重启charles、重新安装描述文件、重启电脑等方式都无法解决,最后尝试升级charles软件,终于解决。 最终成功的环境:mac OS是10.15.2, charles是v4.5.6。
总结
一些比较零碎的知识点,整理之后作为备忘录。