我在尝试从randomBallPick方法中检索返回输出时得到信号错误EXC_BAD_ACCESS
,我可能做错了。
NSString *temp = [self randomBallPick];
upBall1.image = [UIImage imageNamed:temp];
答案 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]