从数组中获取随机对象,然后将其从数组中删除。苹果手机

时间:2011-02-24 00:38:19

标签: iphone arrays object random sdk

我遇到了数组问题,我希望从数组中随机选取一个对象, 然后删除它并删除“if”语句中指定的其他对象。

我做了什么..

中的.h

NSMutableArray *squares;
int s;
NSString *randomN;

接下来,在.m

创建一个新数组:

-(void) array{
    squares = [[NSMutableArray alloc] arrayWithObjects: @"a", @"b", @"c", nil];
}

然后选择一个随机对象,如果满足“if”的属性,则从数组中删除该对象,再次执行while循环。

-(void) start{

    s=5;

    while (s > 0){
     //I even tried it without the next line..
     randomN = nil;

     //Also tried the next line without ' % [squares count'
     randomN = [squares objectAtIndex:arc4random() % [squares count]];

     if (randomN == @"a"){
         [squares removeObject: @"a"];
         [squares removeObject: @"b"];
        s = s - 1;
        }

     if (randomN == @"b"){
         [squares removeObject: @"b"];
         [squares removeObject: @"c"];
        s = s - 1;
        }

     if (randomN == @"c"){
         [squares removeObject: @"c"];
        s = s - 1;
        }

     else {
     s=0;
     }
}
}

当我运行应用程序时,应用程序会在循环开始后停止并退出。

你能帮帮我吗?

4 个答案:

答案 0 :(得分:2)

我认为问题是你在创建数组时应该使用initWithObjects(而不是arrayWithObjects)。

使用init*创建新对象后,应始终使用alloc方法。 arrayWith*方法是'便捷构造函数',autorelease返回的对象。当你使用它时,阵列可能已被释放。

答案 1 :(得分:2)

在objective-c中,您无法使用==比较字符串,您必须使用isEqual:方法。 @"string"表示法生成一个指向内存中其他地方定义的字符串的指针,这些指针可能不同,即使它们指向的数据是相同的。

所以,而不是

if (randomN == @"a"){

if ([randomN isEqual:@"a"]){

答案 2 :(得分:2)

他们的一些问题可能会让你失望:

您正在使用便捷构造函数初始化已分配的数组,您应该选择alloc / init对中的一个或方便构造函数:

[[NSMutableArray alloc] initWithObjects:...]

或:

[NSMutableArray arrayWithObjects:...]

您的删除行正在尝试删除字符串文字。虽然您的数组包含字符串实例,其中包含与您尝试删除的字符串相同的,但它们与字符串的确切实例不同。您需要使用[stringVar isEqualToString:otherStringVar]来比较值而不是它们的引用:

if ([randomN isEqualToString:@"a"])

而不是:

if (randomN == @"a")

此外,由于与第二个问题类似的原因,您的else语句会每次触发。即使您使用正确的字符串比较,如果您尝试仅执行这4个代码块中的一个,那么您的逻辑可能已关闭。要做到这一点,第一个if之后的每个else都需要一个if (/* test 1 */) { } else if (/* test 2 */) { } else if (/* test 3 */) { } else { // chained else's make only one block able to execute } ,如下所示:

if (/* test 1 */) {
}
if (/* test 2 */) {
}
if (/* test 3 */) {
}
else {
    // this else only applies to the LAST if!
}

而不是:

{{1}}

答案 3 :(得分:1)

正如亚历克斯所说,

squares = [[NSMutableArray alloc] arrayWithObjects: @"a", @"b", @"c", nil];

此行应为

squares = [[NSMutableArray alloc] initWithObjects: @"a", @"b", @"c", nil];

squares = [[NSMutableArray arrayWithObjects: @"a", @"b", @"c", nil] retain];

此外,

randomN = [squares objectAtIndex:arc4random() % [squares count]];

如果square为空,则在此行上发生EXC_ARITHMETIC异常(除以零)。