编译修改和编译报错处理
1,修改项目属性,不仅包括主项目,还包括导入的项目,都修改Architecture为$(ARCHS_STANDARD)改了之后编译就会报错,咱们一个个看。
2,curl报错,更换curl库,以支持64位。这个百度能搜到,将新的代码下下来,覆盖原来的目录
3,EGOTextFieldAlertView.h里的CGFloat命名冲突,会遇到两个CGFloat,报错重定义,苹果也事先考虑到了这个问题,所以根据他们提供的宏CGFlOAT_DEFINED就可以解决
4,将CCLuaEngine和PCEventDispatcher里的使用lua有关的指针修改为long。
5,jsonkit.m按照xcode提示修改,这里有一些旧的写法不支持了,所以xcode会提示怎么改成新的正确形式,他怎么提示,就怎么改。
改到这里编译基本能过了。
运行时报错和闪退
6,同事用两种方法输出log时:NSLogv和vsprintf共用变参修改,这个百度搜一下c语言的函数用法,vsprintf,va_copy,va_start,fflush等,
这个报错可能是64位的问题也可能是64位+ios8的问题,两个记录log的函数共用一个变参,有概率闪退。
1,黑屏或卡死,表现为进入游戏黑屏,或者玩了几步之后卡住不动。
原因:结构数据未初始化和系统函数gettimeofday配合使用在64位机器上有系统bug
旧的方式:struct cc_timeval now; gettimeofday((timeval *)now, 0);
now没有初始化,所以里面的值有时候是随机的。
在32位机上正常,但是到了64位机上,这么取值就有问题,得到的结果会非常大。我查了一下苹果的系统函数gettimeofday()文档,没找到跟机器位数相关的说明。至少有一点可以肯定的是,他计算的时候没有严格覆盖now的值,怀疑是其内部实现的时候只计算了低位。
算出来的值在CCDirector中用于计算帧率。所以64位机上帧率变得非常大,大概几十分钟才会走一帧,看上去卡死。
为什么本地调试却没有问题?是因为CCDirector有这么一段实现:
#ifdef DEBUG
// If we are debugging our code, prevent big delta time
if(m_fDeltaTime > 0.2f)
{
m_fDeltaTime = 1 / 60.0f;
}
#endif
解决方案:struct cc_timeval * now=new struct cc_timeval();这里初始化,保证now里是0,0
2,摇一摇无法使用
原因:ios8 64 api废弃
老的实现方式使用UIAccelerometer,在ios5.x的时候就已经宣布要废弃了,但是仍然可以用,直到
64位机出来,才真正的废弃了。
解决方案:使用苹果提供的替代方案<CoreMotion/CoreMotion.h>,网上有很多加速器的使用例子,找个看看。
3,使用obj_msgSend时会闪退
原因:ios8+64位时,苹果的api obj_msgSend出现不兼容。
看看苹果的做法吧,第三个参数看情况用int或id
- (int) doSomething:(int) x { ... }
- (void) doSomethingElse {
int (*action)(id, SEL, int) = (int (*)(id, SEL, int)) objc_msgSend;
action(self, @selector(doSomething:), 0);
}
苹果原文:https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaTouch64BitGuide/ConvertingYourAppto64-Bit/ConvertingYourAppto64-Bit.html
4,提包时报错:最低系统支持不能低于5.1.1
原因:苹果的xcode编辑代码时,修改成64位之后,会自动将最低版本修改为5.1.1,但是如果是使用命令行打包,就不会自行检查最低版本对不对。我们的游戏里,打包系统会读取另一个文件xcconfig里的内容,而且最终编译的值以这里的参数为准,会覆盖project.pbxproj里的值,所以把这里的最低版本改为5.1.1