【问题标题】:iPhone: UILabel applying CGAffineTransformMakeRotation causing mysterious crashiPhone:UILabel 应用 CGAffineTransformMakeRotation 导致神秘崩溃
【发布时间】:2010-04-14 02:22:11
【问题描述】:

-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil parentController:(GameViewController *)myGameController{

有一系列像这样的转换标签:

    deg90 = 1.570796326794897;
//....transforms
    background.center = CGPointMake(160,230);
    background.transform = CGAffineTransformMakeRotation(deg90);

    BetLabel.text = @"test";       
    BetLabel.transform = CGAffineTransformMakeRotation(deg90);

最后一行让我崩溃:

2010-04-13 21:04:47.858 Game[1204:207] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSCFArray objectAtIndex:]: index (1) beyond bounds (1)'
2010-04-13 21:04:47.893 Game[1204:207] Stack: (
    864992541,
    859229716, (lots of numbers)

但是如果我把它注释掉,我会得到很好的文字变化。

更新:呃哦,刚刚做了一个测试.. 结果发现其他转换都在 UIImageViews 上。显然,在这个 xib 中旋转标签会导致崩溃。

但在另一个文件中,转换工作正常:

    newprofileentry.transform = CGAffineTransformMakeRotation(1.570796326794897);
    playerb0.transform = CGAffineTransformMakeRotation(1.570796326794897);
    playerb1.transform = CGAffineTransformMakeRotation(1.570796326794897);

尝试用完整的浮点值替换deg90,仍然是同样的崩溃。

尝试清理缓存,重启 IB 和 Xcode,清理所有目标。程序一直运行良好,直到我添加了这些标签。尝试删除标签、读取并重新连接插座。

感谢阅读,希望有人对此有所了解。

干杯!

【问题讨论】:

  • 您的错误消息意味着错误出现在数组的管理中 - 有一个包含一个元素的数组,您正在尝试使用第二个元素(索引为 1)。这就是为什么我认为你在错误的地方搜索错误。也许,你的代码中有一些数组?
  • 感谢您的回复。我愿意。我也一直在将标签作为子视图添加到视图中 - 但为什么 .transform 会影响这一点?除子视图外,标签不在任何数组中。在初始化数组之前尝试放置此代码,但仍然崩溃。没有任何只有 0 或 1 大小的数组.. 似乎是 UILabel 本身的问题!
  • 您是否尝试过将@"Test" 设为 [NSString stringWithString:@"Test"]?在静态字符串对标签/转换进行一些无效初始化的情况下,可能会发生一些奇怪的事情。通过创建一个新字符串(在为 @"Test" 完成的奇怪初始化之外),这可能会对 UIView 处理转换的方式产生影响。我知道。有一点,但很容易尝试。
  • 请使用M_PI/2 而不是1.570796326794897

标签: iphone objective-c xcode interface-builder uilabel


【解决方案1】:

我建议将转换从initWithNib: 中移出。您可能正在尝试修改尚不存在的内容,因为 nib 中的对象仍在初始化。

您还应该检查 nib 文件(在 Interface Builder 中或使用 ibtool)以查看是否存在带有特定标签的内容。为了测试这一点,您可以将其在初始化中的顺序换成另一个标签,以查看问题是否出在该特定标签上,或者是否与最后位置的任何标签或对象有关。

在上下文中发布更多代码可能会有所帮助。

【讨论】:

  • 感谢大家的回答。奇怪的是,把 newt = [[gametoken alloc] init]; [gametokens2 addObject:newt]; [蝾螈发布];而不是在 for 循环内部做到了这一点。不知道为什么..但它现在有效。在访问该对象的索引 1 时崩溃。不知道为什么标签会与此相关。奇怪的内存错误?