2012-05-10 2 views
0

У меня возникла проблема с доступом/установкой объекта из/в NSArray, возвращаемым с помощью метода CFPreferencesCopyAppValue(). Мое приложение падает в этом случае, тогда как когда я сам выделяю/запускаю его, все работает хорошо.NSArray сбой приложения при обращении к нему

CFArrayRef cfArray; 
    if ((cfArray = (CFArrayRef)CFPreferencesCopyAppValue(CFSTR("buttonsOrder"), appID))) { 
     NSArray *castedArray = [(NSArray *)cfArray retain]; 
     NSLog(@"castedArray : %@", castedArray); 
     buttonsOrder = [castedArray mutableCopy]; 
     NSLog(@"buttonsOrder : %@", buttonsOrder); 
     CFRelease(cfArray); 
     [castedArray release]; 
     castedArray = nil; 
    } 
    else { 
     buttonsOrder = [[NSMutableArray alloc] init]; 
     for (NSMutableDictionary *info in togglesInfo) { 
      [buttonsOrder addObject:[info objectForKey:@"buttonIdentifier"]]; 
     } 
    } 

PS: NSLog() показывает мне, что CFArray возвращается хорошо и отливают в NSArray, а затем NSMutableArray тоже хорошо.

Любая идея?

Edit:

Вот как я modofy массив:

- (void) tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { 
NSUInteger fromIndex = [fromIndexPath row]; 
NSUInteger toIndex = [toIndexPath row]; 
if (fromIndex == toIndex) 
    return; 
NSString *movedButtonId = [[[buttonsOrder objectAtIndex:fromIndex] retain] autorelease]; 
[buttonsOrder removeObjectAtIndex:fromIndex]; 
[buttonsOrder insertObject:movedButtonId atIndex:toIndex]; 

}

+2

У вас есть веская причина, почему вы используете CFPreferences вместо NSUserDefaults? Кроме того, где происходит катастрофа и что такое * * сбой? –

+0

Нет причин для прохождения этого литья/удержания. Вы можете просто взять свою изменчивую копию, а затем выпустить оригинальный 'CFArray'. –

+0

я. Я не получаю доступ к настройкам текущего приложения, поэтому я не могу использовать NSUserDefaults (или я не знаю, как для другого приложения текущего). Сбой происходит, когда я пытаюсь получить доступ (удалить или добавить значения) в массив. Сбой заставит приложение выйти. Спасибо за ваш ответ – DiAifU

ответ

0

Если сбой при попытке добавить объекта в изменяемый массив, который обычно означает, что вы пытаемся добавить нулевой объект. Единственное место (в вашем фрагменте кода выше), где я вижу, что вы добавляете что-либо в свой изменяемый массив, в том случае, когда вы не получили действительный «» из CFPreferences. Вы должны убедиться, что «[info objectForKey:@"buttonIdentifier"]» не возвращает ноль.

Убедитесь, что вы не выбрасываете исключение. Или, если это не так, скажите, какова ваша авария (это будет сказано в журнале консоли Xcode).

+0

В случае, если я не получил действительный CFArray, все работает хорошо, и мое приложение продолжает работать, а [info objectForKey: @ "buttonIdentifier"] никогда не будет , Сбой появляется только при доступе к объекту из массива, инициализированного функцией CFPreferences. – DiAifU

+0

Ошибка: сигнал 5: Trace/BPT trap: 5 ' – DiAifU

+0

Если вы получаете доступ к объекту из массива, инициализированного из CFPreferences, этот код не находится в вашем фрагменте. Измените свой вопрос, чтобы показать этот код, в котором вы получаете доступ (добавление или удаление) изменчивого массива. –

Смежные вопросы