Получение случайного объекта из массива, затем удаление его из массива. iphone - PullRequest
0 голосов
/ 24 февраля 2011

У меня проблема с массивами, я хочу, чтобы объект был выбран случайным образом из массива, а затем удалил его и удалил другие объекты, указанные в операторе 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 ]

2 голосов
/ 24 февраля 2011

В target-c вы не можете сравнивать строки, используя ==, вы должны использовать метод isEqual:. Обозначение @"string" создает указатель на строку, определенную в другом месте в памяти, и они могут отличаться, даже если данные, на которые они указывают, одинаковы.

Итак, вместо

if (randomN == @"a"){

1009 * попробовать *

if ([randomN isEqual:@"a"]){
2 голосов
/ 24 февраля 2011

Вот несколько проблем, которые, вероятно, сбивают вас с толку:

Вы инициализируете уже выделенный массив с помощью вспомогательного конструктора, вам следует выбрать одну из пары alloc / init или вспомогательный конструктор:

[[NSMutableArray alloc] initWithObjects:...]

или

[NSMutableArray arrayWithObjects:...]

Ваши строки удаления пытаются удалить строку литерал . Хотя ваш массив содержит строку экземпляров , которые содержат те же значения , что и строки, которые вы пытаетесь удалить, они не являются точными точными экземплярами строки. Вам нужно использовать [stringVar isEqualToString:otherStringVar] для сравнения значений вместо их ссылок:

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

вместо:

if (randomN == @"a")

Кроме того, ваш оператор else будет запускать каждый раз по тем же причинам, что и вторая проблема. Даже если вы используете правильные сравнения строк, ваша логика, вероятно, отключена, если вы пытаетесь выполнить только один из этих 4 блоков кода. Для этого каждому из if s после первого требуется 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!
}
2 голосов
/ 24 февраля 2011

Мне кажется, проблема в том, что вы должны использовать initWithObjects при создании массива (а не arrayWithObjects).

Вы всегда должны использовать метод init* после использования alloc для создания нового объекта. Методы arrayWith* являются «удобными конструкторами», которые autorelease возвращают объект. К тому времени, когда вы начнете использовать его, массив, вероятно, будет освобожден.

1 голос
/ 24 февраля 2011

Как сказал Алекс,

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]];

Если квадраты пустые, в этой строке возникает исключение EXC_ARITHMETIC (Деление на ноль).

...