扒虫篇-Bug日志 Ⅲ


1.一个警告点击后提示:Treating Unicode character as whitespace

对于追求完美的猿来说,解决警告有时也是必须的。

解决方法:可能是由于粘贴网页上的代码的时候两行之间的回车引起的,有未识别的回车或者换行,找到,删除掉就 OK了。

2.打包发布APP时验证的时候报错

扒虫篇-Bug日志 Ⅲ_第1张图片
Snip20170411_1.png

分析:照上面上面的提示就是说,Bundle Identifier 和配置文件中的 ID是不一致的,可是我确认了很多次,确认是没问题,也重新打包了很多次,再次验证还是有这个问题。WTF?

解决办法:关闭其它所有工程,退出 Xcode文件,再重新打开目标工程(注意,只打开这一个工程,不要打开其他的工程),再次Archive ,验证,就没问题啦。这是由于打开多个工程造车的Bug,目前推测这是Xode 内部的Bug。

3.使用[AVAudioPlayer play]会产生 libc++abi.dylib`__cxa_throw: 异常

我调用AVAudioPlayer play方法,会莫名的产生__cxa_throw异常, 只是简单的调用系统的api,有时候可以,有时候会异常。

解决方案

由于xcode中设置了当所有异常出现时的全局断点,这是问题的关键。
解决办法是将all改为Objective-C:

扒虫篇-Bug日志 Ⅲ_第2张图片
Paste_Image.png

问题解决。

4. 明明加了刷新了控件了,可是就是上拉没效果

这真是一个蛋疼的Bug,我使用的是 SDRefresh,一个Tb上明明加了上提加载的刷新,可是就是上提没有效果,还以为是什么问题了,折腾了2小时,研究底层,尝试了很多办法,还是不行, WTF !!!

解决办法:我之所以出现这样的现象是因为我的 Tb只有两条数据,只占到了Tb的1/3,当数据比较多时,数据铺满屏幕时,这个上提加载的效果就出来了,看来是 SDRefresh 的刷新机制是当数据比较少时,不触发刷新效果,这在情理之中又超出常规思维。

5. 真机调试,一处:Undefined symbols for architecture arm64:

扒虫篇-Bug日志 Ⅲ_第3张图片
Snip20170207_9.png

在集成 萤石SDK的时候,把应该添加的 系统类库都添加完了后,编译还是报这个错误,而原Dome中运行正常。

最后发现,原Dome里面的 openssl类库没有添加进来,才导致的这个错误。

OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。
其主要库是以C语言所写成,实现了基本的加密功能,实现了SSL与TLS协议。OpenSSL可以运行在绝大多数类Unix操作系统上。

OpenSSL了解更多

6. 真机调试,另一处:Undefined symbols for architecture arm64:

扒虫篇-Bug日志 Ⅲ_第4张图片
Snip20170208_2.png

这是使用SDWebImage 类库报的错,不知道什么原因,一样的代码在另一个工程中就不会出出现这样的报错,好无语。

解决办法: 导入 MapKit and ImageIO frameworks.即可。

7. #include "api/UserBind.h" 找不到

扒虫篇-Bug日志 Ⅲ_第5张图片
Snip20170216_1.png

导入了一个第三方文件夹,文件夹的目录是这样的:


扒虫篇-Bug日志 Ⅲ_第6张图片
Paste_Image.png

我们可以看到这是一个包含C/C++文件的文件夹。这就是问题所在,对于导入的 OC文件是不需要这样设置也可以搜索到的,因为是C/C++文件,才需要设置路径。

首先我们来了解下,有关iOS开发中的Search Paths设置问题:

添加目录的时候写上 “$(inherited)” 就表示从frameworks里面读取。
Library Search Paths
附加到项目中的第三方Library(.a files)的搜索路径,Xcode会自动设置拖拽到Xcode中的.a文件的路

Always Search User Paths
如果设置了Always Search User Paths为YES,编译器会优先搜索User Header Search Paths配置的路径,在这种情况下#include ,User Header Search Paths搜索目录下面的文件会覆盖系统的头文件。

C/C++ 头文件引用问题
include <> 引用编译器的类库路径下的头文件
include “” 引用工程目录的相对路径的头文件
include 是编译指令,在编译时,编译器会将相对路径替换成绝对路径,因此,
头文件绝对路径=搜索路径+相对路径。
Xcode Build Settings 下 Search Paths设置搜索路径
Header Search Paths:头文件搜索路径设置
(PROJECT_DIR)宏都指xxx.xcodeproj所在的父目录

扒虫篇-Bug日志 Ⅲ_第7张图片
Paste_Image.png
扒虫篇-Bug日志 Ⅲ_第8张图片
Paste_Image.png

Other Linker Flags:其他链接标签,当导入的静态库使用了类别,需要设为-ObjC。

Project的Building Settings中的设置默认并不被Targets继承,**只有当Targets的设置加入了(inherited)” 就表示从frameworks里面读取。

*******************更新*******************

扒虫篇-Bug日志 Ⅲ_第9张图片
Paste_Image.png
扒虫篇-Bug日志 Ⅲ_第10张图片
Paste_Image.png

解决方法:
Header Search Paths 设置

Paste_Image.png

这里要说一下,根据工程目录,我们可以看见有一层 Third,但是我们搜索路径中并未设置这一层,是因为,Third是虚拟目录,实际上并不存在的,而且我们不能设置为 ..../Pay/openssl 不能加上 /openssl,否则会仍然报错,因为报错图片中已经自带了一层 /openssl路径。

8. ....Podfile.lock:No such file or directory

心得:越诡异的Bug越有可能是最低级的手误造成的,比如新建A,对A初始化设置,实际使用的时候,又新建了B,使用了B,没有对B设置,这就造成了莫名其秒的Bug了。

开始的时候用pod install/update各种都没有用。后来试了这种方法,重新build就ok。
在工程设置中的Build Phases下删除Check Pods Manifest.lock及Copy Pods Resources
然后我删除了pods 工程,运行原工程时,报错,找不到一个路径。

扒虫篇-Bug日志 Ⅲ_第11张图片

最后在这发现了一个红色的文件,删除之,再次编辑就行啦。

9.项目导入外部文件后编译运行出现Undefined symbols for architecture x86_64错误**

Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_Person", referenced from:
objc-class-ref in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

这说明编译没有问题,连接的时候出错了,找不到导入的目标文件。
遇到这种问题,首先想到的是导入文件编译环境发生了变化,所以先选择Product-Clean将项目缓存清理一下,Xcode清理项目缓存。但是这样做还是不行,那怎么办呢?

解决方案:
我们应该这样做,看项目有没有编译导入的文件,在这个位置查看:
选择项目-Build Phases选项卡-Compile Sources Xcode查看项目编译项目
这里只有一个main.m,Person.m没有被编译,当然错误了,将Person.m添加进去就OK了。点击下面的”+”添加,注意只添加.m文件,不添加头文件!

10.编译报错_iconv

Undefined symbols for architecture i386:
  "_iconv", referenced from:
      _mail_iconv in libmailcore.a(charconv.o)
  "_iconv_open", referenced from:
      _charconv in libmailcore.a(charconv.o)
      _charconv_buffer in libmailcore.a(charconv.o)
  "_iconv_close", referenced from:
      _charconv in libmailcore.a(charconv.o)
      _charconv_buffer in libmailcore.a(charconv.o)
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status

解决办法:导入系统的 libiconv.tbd 类库即可。

你可能感兴趣的:(扒虫篇-Bug日志 Ⅲ)