Msgstr "Один шаг до выхода из функции objc_exception_throw, которая не имеет информации о номере строки."при использовании перечисления в цели c - PullRequest
0 голосов
/ 01 марта 2012

Я нашел похожий вопрос, который вызвал то же исключение, но это не помогло.Никто не ответил: Получение «Один шаг до выхода из функции CALayerGetDelegate, которая не имеет информации о номере строки».in iphone sdk

Пример параметра, который работает, когда программа имеет значение aa+a+

Пример параметра, который вызывает разрыв, когда метод, вызываемый программой-параметром снова, равен aa+a+a.Почему?

Вот мой код:

+(NSSet *)variablesUsedInsideProgram:(id)program
{

    NSMutableSet *variablesUsed = [NSMutableSet setWithArray:program];
    //put the program into a mutable set then pop off everything else that is !a,!b,!c

    id objectReferenceFromVariablesUsed = nil;
    for(objectReferenceFromVariablesUsed in variablesUsed) //breaks here
    {
        if (!([objectReferenceFromVariablesUsed isEqual:@"a"] | [objectReferenceFromVariablesUsed isEqual:@"b"] | [objectReferenceFromVariablesUsed isEqual:@"c"]))
        {
            [variablesUsed removeObject:objectReferenceFromVariablesUsed];
        }
    }
    return [variablesUsed copy];
}

Распечатка отладочных операторов, которые я получаю:

(gdb) po program<__NSArrayI 0x68a7a00>(a,a,+,a,+,a)

, поэтому я знаю, что моя программа помещена в переменную a

(gdb) po variablesUsed
{(
    "+",
    a
)}

Уникальные значения из программы при добавлении в NSMutableSet

То, что я знаю, что происходит:

objectReferenceFromVariablesUsed = +, затем оно выталкивается из Set

(gdb) po variableUsed {(a)}

Возвращается в цикл, затем прерывается.Получает сообщение об ошибке «Один шаг до выхода из функции objc_exception_throw, у которой нет информации о номере строки. Точка захвата 2 (выброшено исключение).

Кто-нибудь знает, что может быть причиной этого?

Ответы [ 2 ]

2 голосов
/ 01 марта 2012

Оригинальный ответ (и полезный комментарий Уолта):

Вы изменяете набор, перечисляя его

, что недопустимо в Objective-C быстрое перечисление.- Уолт Селлерс 1 марта в 8:22


Обновление:

Что делать вместо:

Лучшим подходом было бы добавить объекты, которые должны быть удалены, в новый набор и обновить оригинал, удалив все объекты в новом наборе, используя -minusSet: (документация ниже).Из документации следует отметить, что объекты удаляются на месте (новый набор не возвращен).

minusSet:

Removesкаждый объект в другом заданном наборе из принимающего набора, если он присутствует.

- (void)minusSet:(NSSet *)otherSet

Параметры

otherSet

набор объектов для удаления из принимающего набора.


Фактическая реализация (модификация вашего кода)

Чтобы удалить все объекты, которые не являются "a", "b "или" c ", вы сначала должны создать новый NSMutableSet (objectsToBeRemoved) для добавления объектов, которые должны быть удалены.Перечисляя исходный набор (variableUsed) и находя объект, который следует удалить, добавьте его в новый набор (objectsToBeRemoved).После перечисления удалите все объекты, которые должны быть удалены, вычислив исходный набор минус набор объектов для удаления.

+(NSSet *)variablesUsedInsideProgram:(id)program
{
    NSMutableSet *variablesUsed = [NSMutableSet setWithArray:program];
    //put the program into a mutable set then pop off everything else that is !a,!b,!c

    NSMutableSet *objectsToBeRemoved = [[NSMutableSet alloc] init];

    id objectReferenceFromVariablesUsed = nil;
    for(objectReferenceFromVariablesUsed in variablesUsed)
    {
        if (!([objectReferenceFromVariablesUsed isEqual:@"a"] || 
              [objectReferenceFromVariablesUsed isEqual:@"b"] || 
              [objectReferenceFromVariablesUsed isEqual:@"c"]))
        {
            [objectsToBeRemoved addObject:objectReferenceFromVariablesUsed];
        }
    }

    return [[variablesUsed minusSet:objectsToBeRemoved] copy];
}
0 голосов
/ 04 марта 2012

ИСПРАВЛЕНО!

+ (NSSet *) переменныеUsedInsideProgram: (id) программа {

NSMutableSet *variablesUsed = [NSMutableSet setWithArray:program];
NSMutableSet *variablesUsed1 = [NSMutableSet setWithArray:program]; **//HERE**
//put the program into a mutable set then pop off everything else that is !a,!b,!c

id objectReferenceFromVariablesUsed = nil;
for(objectReferenceFromVariablesUsed in variablesUsed) //breaks here
{
    if (!([objectReferenceFromVariablesUsed isEqual:@"a"] | [objectReferenceFromVariablesUsed isEqual:@"b"] | [objectReferenceFromVariablesUsed isEqual:@"c"]))
    {

        [variablesUsed1 removeObject:objectReferenceFromVariablesUsed];
    }
}
return [variablesUsed1 copy];

}

...