问题记录

. MKMapView 疑似无法释放

环境:XCode9.2, iOS10.3.3, iPhone5
>问题描述:从控制器 A present 到控制器 B,B 中添加了一个 MKMapView,之后从 B dismiss 回 A,结果是控制器 A 整个界面无法进行任何操作,像是整个屏幕被蒙上一层透明的遮罩。
进行检查后,发现屏幕并无透明遮罩。
通过 Storyboard 和代码两种方式去初始化 MKMapView,都是相同的结果。

> 解决:
这可能是 MKMapView 的析构函数的问题,不管你的地图视图对象如何配置,在Xcode8和iOS10系统下都有几率出现冻结你的应用程序,主线程挂起。在dealloc方法中添加如下代码,可解决

- (void)dealloc
{
#if DEBUG
    // Xcode8/iOS10 MKMapView bug workaround
    static NSMutableArray* unusedObjects;
    if (!unusedObjects)
        unusedObjects = [NSMutableArray new];
    [unusedObjects addObject:mapView];
#endif
}

. UITableView 顶部偏移问题

环境:XCode9.2, iOS10.3.3, iPhone5
>问题描述:在控制器 A 中添加了2个 UITableView,tableA 和 tableB。 tableA 的顶部向下偏移了20个像素,tableB 显示正常。设置以下代码没有作用
    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.automaticallyAdjustsScrollViewInsets = NO;

> 解决:
当你的控制器上面添加了一个控件的时候, 再添加 tableView 时(也就是说 tableView 不是控制器上的第一个视图时), tableView就会做出判断, 不会向下偏移。添加以下代码可解决

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    tableA.contentInset = UIEdgeInsetsZero;
    tableA.scrollIndicatorInsets = UIEdgeInsetsZero;
}

. NSTimer 刷新 UIButton 文字时闪烁

环境:XCode9.2, iOS10.3.3, iPhone5
问题描述:自定义了一个获取验证码时用的倒计时按钮,在每次刷新文字时都会闪烁

> 解决:
将 UIButton 的 type 从 system 改为 custom 即可。

. -ObjC 引起的 duplicate symbols

问题描述:在项目中用到了 A,B 两个公司的 framework,A公司的 framework 需要设置 -ObjC 才可以正常使用,但加了 -ObjC 后 B 公司的 framework 就会报 duplicate symbols 错误。

原因分析:
Other linker flags 对应 ld 命令执行时后面所加的参数
-ObjC:链接器会把静态库中所有的 .o 文件都加载到可执行文件中(如果库中和加载库的程序有重复的文件,便会出现如上错误)
-all_load:链接器会把所有找到的目标文件都加载到可执行文件中
-force_load:把指定要加载路径的库文件全部加载,不影响其余库文件。

解决方法:
删除 -ObjC
使用 -force_load 加载 A 公司的 framework

. unknown type name 'NSString' NSObjcRuntime.h

问题描述:在项目中使用了一些第三方库,其中 有大量的 .c .mm 文件

原因分析:出现这个错误大部分是因为有 c, c++, OC 等混编造成

解决方案:在 .pch 文件中 添加以下判断代码: 
#ifdef __OBJC__ 
// your code
#endif

. AFNetWorking 下载文件时 progressHandler 不执行

问题描述:项目中使用 AFNetWorking 下载一个压缩包,但 progressHandler 怎么都不执行

原因分析:查看 AFNetWorking 的源码发现,progressHandler 回调是通过 KVO 监测 NSProgress 的 fractionCompleted 属性来回调的,没有回调说明 fractionCompleted 没有变化。继续找发现 NSURLResponse 的 expectedContentLength 值为 -1。

解决方案:expectedContentLength 出现 -1 说明 Http 响应头中没有设置 Content-Length,response 不知道下载文件的大小
通知后端人员在响应头中增加 Content-Length,值等于要下载的文件大小

. OC 主线程中调用同步函数造成死锁

NSLog(@"111");
dispatch_sync(dispatch_get_main_queue(), ^{
    NSLog(@"sync");
});
NSLog(@"222");

问题描述:执行以上代码,后台输出 111 后,执行到 dispatch_sync 这句代码时会报错 EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP,subcode=0x0)

执行报错

原因分析

  1. 主线程是一个串行队列
  2. 执行 dispatch_sync 同步操作时,将 block 中的任务 NSLog(@"sync"); 添加到主线程队列末尾。
  3. NSLog(@"sync"); 要执行,需要它前面的任务执行完成,而它前面的任务是 dispatch_syncdispatch_sync要执行完成又需要 block 中的任务执行完成。
  4. 由此造成了互相等待,block 中的任务永远不会执行。

. Code signing fails with error 'resource fork, Finder information, or similar detritus not allowed'

问题描述:build & run 过程中一直这个错

原因分析:这是 iOS 10 引入的安全加固变化。代码签名不再允许应用包中的任何文件具有包含资源分支或Finder信息的扩展属性。不太明白。

解决方案:在 DerivedData 中找到打出的 .app 包,在终端中执行以下命令
xattr -lr Foo.app

执行后将会列出有问题的文件,依次修改后,clean then build 即可。 

你可能感兴趣的:(问题记录)