【问题标题】:When random number shows twice, my object crashes the iPhone app! :(当随机数显示两次时,我的对象会使 iPhone 应用程序崩溃! :(
【发布时间】:2011-04-21 21:17:57
【问题描述】:

我正在像往常一样开发一个不错的应用程序,然后发生了这种情况!你在我的应用程序中旋转命运之轮,旋转动画结束后,应用程序应该随机化一个数字,并将匹配的卡片显示为数字索引。

卡片存储在 NSMutableArray 中,第一次调用时可以完美运行。例如。当应用程序随机数“1”卡号1被调用并显示没有问题! 但是一旦随机化器再次点击“1”,应用程序就会在下面指定的行崩溃。

这是代码,请帮助我:)

NSNumber *cardNumber;
    cardNumber = [NSNumber numberWithUnsignedInt:arc4random()%[appDelegate.cardArray count]];

    NSLog(@"%@", cardNumber);

    SpinCard *selectedCard = [appDelegate.cardArray objectAtIndex:[cardNumber doubleValue]];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    [snurrKnapp setAlpha:100];
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:cardView cache:YES];
    [UIView commitAnimations];
    [snurrKnapp setEnabled:YES];
    if(![cardTitle.text isEqualToString:selectedCard.cardTitle]) { //Crashes here
        [cardTitle setText:selectedCard.cardTitle]; //If I remove the if-case it crashes here
        [cardContent setText:selectedCard.cardContent];
    }
    [selectedCard release];

这是我得到的错误:

2011-04-21 23:10:54.296 Snurra Flaskan[947:707] 0
2011-04-21 23:10:58.794 Snurra Flaskan[947:707] 2
2011-04-21 23:11:02.691 Snurra Flaskan[947:707] 1
2011-04-21 23:11:08.977 Snurra Flaskan[947:707] 2
warning: Unable to read symbols for /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.3.1 (8G4)/Symbols/Developer/usr/lib/libXcodeDebuggerSupport.dylib (file not found).
(gdb) 

【问题讨论】:

  • 好像 cardArray 被释放了,这可能是原因,你能发布一个你分配数组的代码的 sn-p 吗?
  • 在哪里初始化 cardTitle 变量?我的猜测是 cardTitle 变量在超出某个范围时以某种方式被释放,从而导致错误。您可以尝试在您的方案(参数选项卡)中设置 NSZombieEnabled=YES 以查看是否有指向已释放对象的指针,请参阅:stackoverflow.com/questions/2190227/…
  • 跟踪这样的过度释放错误的一个技巧是为您的对象提供您认为不需要的额外保留,并查看崩溃是否消失。另一个是enable zombies
  • 找到了!由 selectedCard 的释放引起的.. wierd?

标签: iphone xcode random nsstring nsnumber


【解决方案1】:

我是 Obj-C 的新手,但这是我认为正在发生的事情。

你不应该打电话给[selectedCard release];

因为 objectAtIndex 没有为 selectedCard 分配新的 SpinCard。你不应该释放它。这就解释了该 SpinCard 的第二次使用行为:您不能使用它,它已经发布了。

【讨论】:

  • 是的,这应该是正确的。只有名称中带有 alloccopyretain 的方法才应使用 release 手动释放自动释放.
猜你喜欢
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
相关资源
最近更新 更多