iPhone 发布版本的功能与调试版本不同
Posted
技术标签:
【中文标题】iPhone 发布版本的功能与调试版本不同【英文标题】:iPhone release build not functioning the same as debug build 【发布时间】:2009-08-31 17:44:51 【问题描述】:在使用调试版本时,我的程序在 iPhone 模拟器和 iPhone 本身上都按照我希望的方式运行。但是,当我将其更改为发布版本时,它可以在 iPhone 模拟器上运行,但不能在设备上运行。我正在尝试使用计时器在屏幕上为球设置动画,如果球与屏幕边缘碰撞,球应该从侧面反弹。这适用于调试版本,但发布版本仅适用于模拟器而不适用于设备。在发布版本的设备上,球甚至不会移动。
我感觉这与从调试版本切换到发布版本时更改的优化级别有关。如果这是真的,我该如何更改我的代码以更好地适应优化级别?
视图控制器使用 initWithNibName: 调用,其中包含:
CGRect ballRect = CGRectMake(133, 424, 55, 56);
newBall = [[Ball alloc] initWithFrame: ballRect];
[self.view addSubview: newBall];
[self setImage: [UIImage imageNamed: @"Red.png"]];
Ball *newBall 在接口文件中声明。球在屏幕上正确显示,所有版本的图像都正确。
当用户点击屏幕时,将调用移动球的计时器:
-(void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event
touch = [touches anyObject];
touchPoint = [touch locationInView: self.view];
dx = touchPoint.x - newBall.center.x;
dy = touchPoint.y - newBall.center.y;
newBallTimer = [NSTimer scheduledTimerWithTimeInterval: 1.0/50.0 target: self selector: @selector(moveBall) userInfo: nil repeats: YES];
接口文件中也声明了CGPoint touchPoint、UITouch *touch、float dx、float dy和NSTimer *newBallTimer。
这是我移动球和检测碰撞的代码:
-(void) moveBall
newBall.center = CGPointMake( newBall.center.x + dx, newBall.center.y + dy );
// left boundary
if( newBall.frame.origin.x <= 20 )
dx = abs(dx);
else if( newBall.center.x >= 280 )
dx = -abs(dx);
在设备上发布版本时,球不会移动。相反,它似乎被发送到屏幕底部并停留在那里。
非常感谢任何建议/解决方案/想法。 提前致谢!
【问题讨论】:
我猜你必须向我们展示代码。尽量减少代码,我们会更容易发现bug,有时你甚至会在这个过程中自己发现bug。 好吧,我已经发布了一些代码。希望这会有所帮助。 比较两个构建配置的差异。也许您在调试中定义了一些东西,但在发布中没有定义。模拟器并不总是正确的,所以不要考虑这个问题。 嗯……你有没有尝试在 moveBall 方法中设置断点?它是否按预期工作? 【参考方案1】:您如何将版本构建到您的设备上?还是您的意思是 Ad Hoc 构建?
在任何一种情况下,您是否有任何 #define 或 #ifdef 代码块在您进行发布构建时可能被注释掉?
另一种可能性是在 NSAssert 中执行实际逻辑,然后在发布版本中关闭断言。当您关闭断言时,该断言中的任何代码都不会被调用。
【讨论】:
感谢您的回复。为了在设备上发布版本,我将活动 SDK 设置为 iPhone Device 3.0,并将活动配置设置为 Xcode 中的发布。我确实有#define 语句以及#include,但它们都没有被注释掉。我不使用 NSAssert。以上是关于iPhone 发布版本的功能与调试版本不同的主要内容,如果未能解决你的问题,请参考以下文章
iOS 14.3 终于来了,连 iPhone 5S/6 也有更新!