iphone开发 - GDB错误信号EXC_BAD_ACCESS

时间:2009-12-07 05:21:41

标签: iphone

我在尝试从randomBallPick方法中检索返回输出时得到信号错误EXC_BAD_ACCESS,我可能做错了。

NSString *temp = [self randomBallPick];
upBall1.image = [UIImage imageNamed:temp];

5 个答案:

答案 0 :(得分:0)

添加/删除的数组(容器)retain / release项。

当对象从release的容器中删除时,该对象将会收到removeObjectAtIndex:,因此您需要 retain才能将其删除,并且autorelease因为你从你的方法中返回它。

NSString * chosenFilename =
          [[[imageArray objectAtIndex:chosen] retain] autorelease];
[imageArray removeObjectAtIndex:chosen];
return chosenFilename;

答案 1 :(得分:0)

好的,你能试试吗?

NSString *chosenFilename = [[imageArray objectAtIndex:chosen] retain];
[imageArray removeObjectAtIndex:chosen];
return [chosenFilename autorelease];

答案 2 :(得分:0)

您需要做的就是:

NSString *chosenFilename = [[imageArray objectAtIndex:chosen] retain];

由于objectAtIndex方法返回一个自动释放对象。

答案 3 :(得分:0)

这段代码有几个问题。

你正在初始化你的名字一次,但是你继续从中删除东西...我不确定你想要这样做,否则你将开始独家返回零(在第38次召唤之后... )。在这种情况下,您可能需要重新填充阵列。这是你日常工作的更好版本(我认为):

static NSMutableArray *imageArray = nil;

if (!imageArray.count) {
    if (imageArray==nil) imageArray = [[NSMutableArray alloc] init];
    for (int c = 0; c < 37; c++)
    {
        NSString *imageName = [NSString stringWithFormat:@"ball_%i.png", c];
        [imageArray addObject:imageName];
    }
}
// Now we are basically sure that imageArray.count > 0
assert(imageArray.count>0);
NSUInteger chosen = arc4random() % imageArray.count;
NSString *chosenFilename = [[imageArray objectAtIndex:chosen] retain];
[imageArray removeObjectAtIndex:chosen];
return [chosenFilename autorelease];

正如其他人所说,你必须保留然后自动释放从数组中提取的字符串(因为数组在删除时会释放它们)。

另请注意,您应该在字符串之前调用'retain',然后再将从数组中删除。该字符串已在removeObjectAtIndex:调用后释放...因此,保留它已经太晚了。

答案 4 :(得分:-1)

只要从数组中删除对象,其保留计数可能为零,并且将被取消分配。尝试做

return [[chosenFilename] retain] autorelease]