为什么发布版本失败而不是调试?

时间:2009-06-30 15:00:19

标签: iphone xcode iphone-sdk-3.0 build

我有一个设备/调试版本,工作正常。当我构建发布并分发到设备上时,我收到此错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[UILabel setWidth:]: unrecognized selector sent to instance 0x1605a0'

发生在cellForRowAtIndexPath:

cell.videoName.width = 163.0;

其中cell是自定义UITableViewCell,videoName是UILabel。为什么调试版本工作正常并且发布失败?分发构建也失败了。所有都设置为Base SDK == iPhone OS 3.0。

要将版本构建到手机上,我只是将代码签名更改为开发人员。我也尝试通过iTunes进行分发构建,但它失败并出现同样的错误。

---编辑---

我正在加载这样的单元格:

static NSString * QuestionCellIdentifier = @"QuestionCellIdentifier";
TopicCellController *cell = (TopicCellController *)[tableView dequeueReusableCellWithIdentifier:QuestionCellIdentifier];

if(cell == nil){
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"TopicCell" owner:self options:nil];
    cell = [nib objectAtIndex:0];
}

cell.videoName.width = 163.0;

在运行时,单元格是自定义类型,videoName不是nil。如果我删除最后一行(设置宽度),它可以正常工作。

---编辑:新发现---

我发现,不是调用宽度,而是可以执行此操作,它可以在发布中使用:

cell.videoName.frame = CGRectMake(10, 10, 100, 30);

这真的没有任何意义。

4 个答案:

答案 0 :(得分:1)

根据我的经验,这通常是因为已分配的内存在调试版本中初始化为0x00,而不是在发布版本中。因此,在发布版本中,您的数据结构中的一个成员具有一个选择器,该选择器不受其他内容的影响。在调试版本中,它设置为零。

但我不知道iPhone SDK环境是否将内存初始化为零 - 调试版本中的更现代的开发环境似乎将新分配的内存初始化为0xcd而不是0x00

另外,您可能需要查看this StackOverflow question.

答案 1 :(得分:0)

听起来你有一些调试代码(跟踪NSLog?)有副作用,或者你的线程之间只有间歇性的竞争条件才出现在更快的发布版本中。

所以我首先检查调试依赖的代码然后如果你有任何后台线程检查它们是否会影响单元格。

它可能也是你的cellForRowAtIndexPath重用标识符处理中的错误,有时会导致nil - 但很难理解为什么这只会在发布版本中发生。如果没有看到自定义单元格的设置方式,则很难对其进行更多评论。

答案 2 :(得分:0)

应该是:

cell.videoName.frame.size.width = 163.0;

UILabel没有width属性,它有一个带宽度字段的frame属性。

答案 3 :(得分:0)

它也是发布失败而不是在调试中的原因是该版本的某些目标构建设置与调试不同,请参阅哪些不同。通常发布有更多的优化。这将看到你的应用程序中的错误(如内联代码),你的默认目标中的错误恰好在你的运气不好的情况下看到记忆中的好位置(或者是一个空白点,或者只是碰巧有一个点它中的一个整数,这就是你所期望的),它不会引发异常,其中内联它移动代码,以便你的bug现在访问内存中的其他地方..