iOS开发笔记(十三)

2020-02-18 15:29:02 浏览数 (1)

前言

分享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。

总结

一些比较零碎的知识点,整理之后作为备忘录。

0 人点赞