2009-06-30 61 views
1

我有一个设备/调试版本工作正常。当我建立发布和分发到设备上,我得到这个错误:为什么版本构建失败并且不能调试?

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

它在发生的cellForRowAtIndexPath:

cell.videoName.width = 163.0; 

,其中电池是一个自定义的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不为零。如果我删除最后一行(设置宽度),它工作正常。

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

我发现,而不是调用宽度,我能做到这一点,它在发布工作:

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

那真的没有任何意义。

回答

0

这听起来像你要么得到了有副作用一些调试代码(用的NSLog?跟踪),或者你有只出现在较快的发行版本的线程之间的间歇竞争条件。

所以我会首先检查调试相关的代码,然后,如果您有任何后台线程检查它们是否会影响细胞。

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

+0

我编辑过一些额外的信息来解决您的意见。谢谢。 – 4thSpace 2009-06-30 15:30:28

1

在我的经验,这通常是因为分配的内存在调试版本初始化为0x00,而不是在一个发布版本。因此,在发布版本中,数据结构的一个成员有一个剩余的选择器。在调试版本中,它被设置为零。

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

此外,您可能要检查this StackOverflow question.

+0

您提供的链接适用于Visual Studio。请注意,这是iPhone/Xcode。 – 4thSpace 2009-06-30 19:22:10

0

它应该是:

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

的UILabel没有一个width属性,它具有宽度领域的框架属性。

0

也是因为它在发布失败而不是在调试中是因为该版本有一些与调试不同的目标构建设置,请看哪些不同。通常发布版本正在进行更多优化。这会在您的应用程序中看到错误(如内联代码),您的默认目标中的错误恰好在您的零件上发现运气不好(或空白点,或仅仅是碰巧存在的点一个整数,这就是你所期待的),这不会引发异常,其中内联它将移动代码,以便您的bug现在访问内存中的其他位置..

相关问题