10.在多个苹果平台和设备以及64位体系结构上运行应用
2021-12-01 本文已影响0人
LucXion
开发多平台应用(iOS的不同版本)
- Base SDK 编译器使用该版本的SDK来编译和构建应用。一般使用最新的SDK,苹果会处理API的废弃。
- Deployment Target 控制运行应用需要的最低操作系统版本。
- 支持多个SDK时的注意事项
- 框架:采用弱连接(weak-link),缺失的符号会自动变成空指针。(Build Phasea->Link Binary With Libraies->由Required改为Optional)
- info.plist中的UIRequiredDeviceCapabilities可以控制应用只能在拥有指定硬件功能的设备上运行。
新提交的应用,必须也能在应用更新前支持的设备上运行。比如1.0版本支持iPhone和iPad,那么更新后不能只支持iPhone。
调试
Build Settings -> Build Optional -> Debug Infomation Formate : 设置自动生成的调试文件格式
NSZombieEnabled: scheme->Enable Zombie Object : 用一个僵尸实现替换dealloc实现,对象引用计数为0时,会用一个僵尸对象代替该对象,僵尸对象的作用在于你向它发送消息,会显示一段日志并跳入调试器。
不同的崩溃类型
- EXC_BAD_ACCESS :访问一个已释放的对象或向它发送消息。常见于初始化方法中初始化对象用错了所有权修饰符
- SIGSEGV:段错误信号,当硬件出现错误、访问不可读的内存地址、向受保护的内存地址写入数据时发生。常见于不正确的类型转换。
- SIGBUS访问内存中的无效地址,地址指向的位置不是物理内存地址,可能是某个硬件芯片地址。
SIGSEGV、SIGBUS都是EXC_BAD_ACCESS的子类
- SIGTRAP:代表陷阱信号,并不是真正的崩溃信号。会在处理器执行trap指令时发送。LLDB通常会处理这个信号,并在指定的断点处停止运行。如果收到了不明原因的SIGTRAP,先清除上次输入,重新构建一般能解决问题。
- EXC_ARITHMETIC:当要除0时发送。
- SIGILL:非法指令信号,当函数指针传给另一个函数时,由于某些原因该函数指针是坏的,指向了一个已经释放的内存或者数据段,有时你会收到EXC_BAD_INSTRUCTION而不是SIGILL,但它们是一回事。
EXC_*信号不依赖体系结构
- SIGABRT:中止信号,cocos2d或UIKit框架通常在特定前提条件没满足或一些糟糕的情况出现时,调用C函数的abort来发送SIGABRT信号。通常通过LLDB的bt命令回溯信息,来找出原因。
看门狗超时,固定错误码0x8badf00d(Ate bad food)。见于同步网络调用导致主线程阻塞。
自定义错误信号处理 NSUncaughtExceptionHandler