1

我有一个运行良好的设备/调试版本。当我构建发布并分发到设备上时,我收到此错误:

*** 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

4 回答 4

1

以我的经验,这通常是因为分配的内存是0x00在调试版本中初始化的,而不是在发布版本中。因此,在发布版本中,您的数据结构的成员之一有一个选择器,该选择器是从其他东西中遗留下来的。在调试版本中,它被设置为零。

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

此外,您可能想检查这个 StackOverflow 问题。

于 2009-06-30T16:10:16.813 回答
0

听起来您要么有一些具有副作用的调试代码(使用 NSLog 跟踪?),要么您在线程之间存在间歇性竞争条件,仅出现在较快的发布版本中。

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

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

于 2009-06-30T15:13:47.283 回答
0

它应该是:

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

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

于 2011-06-18T13:09:15.210 回答
0

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

于 2011-09-23T02:57:05.620 回答