XCode Crash Log NSMutableDictionary Nil Проверка Проблема - PullRequest
0 голосов
/ 08 февраля 2012

Мой журнал сбоев XCode указывает на эту строку кода, где происходит сбой:

if(contentDict != nil && [contentDict count] > 0) {

Я бы подумал, что это не может произойти сбой, так как он сначала проверяет 'nil', а с '&&' он больше не проверяет. Может ли быть сбой в предыдущей строке? У меня есть 2 журнала сбоев, которые указывают на один и тот же номер строки. Ниже приведен метод, из которого он исходит:

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
channelIndex = [[NSMutableArray alloc] init];

BOOL reachable = [self networkReachable];
if (!reachable) {
    NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:kContent];       
    contentDict = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    if(contentDict == nil || [contentDict count] == 0) {
        contentDict = [[NSMutableDictionary alloc] init];
    }
    data = [[NSUserDefaults standardUserDefaults] objectForKey:kHistory];       
    historyDict = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    if(historyDict == nil || [historyDict count] == 0) {
        historyDict = [[NSMutableDictionary alloc] init];
    }
}

if(selectedIndex == 0) {
    if(contentDict != nil && [contentDict count] > 0) {
        NSArray *keys = [contentDict allKeys];
        keys = [keys sortedArrayUsingSelector: @selector (compare:)];  
        for (NSString *key in keys) {
            NSLog(@"%@ is %@",key, [contentDict objectForKey:key]);
            Content *content = [contentDict objectForKey:key];
            if (![channelIndex containsObject:content.channelName])
            {            
                [channelIndex addObject:content.channelName];
            }        
        }
    }
} else {
    if(historyDict != nil && [historyDict count] > 0) {
        NSArray *keys = [historyDict allKeys];
        keys = [keys sortedArrayUsingSelector: @selector (compare:)];  
        for (NSString *key in keys) {
            NSLog(@"%@ is %@",key, [historyDict objectForKey:key]);
            Content *content = [historyDict objectForKey:key];
            if (![channelIndex containsObject:content.channelName])
            {            
                [channelIndex addObject:content.channelName];
            }        
        }
    }
}
return [channelIndex count];

}

Ответы [ 2 ]

0 голосов
/ 09 февраля 2012

Код, который вы указали, устанавливает переменную экземпляра contentDict только тогда, когда сеть недоступна, поэтому первый вопрос будет таким: как она устанавливается, когда сеть достижима ?По всей вероятности, он устанавливается где-то еще и не сохраняется должным образом, поэтому словарь освобождается перед проверкой.

Вот несколько советов:

  1. Префикс ваших переменных экземплярас подчеркиванием, например _contentDict, а не contentDict.
  2. Избегайте прямых ссылок на переменные экземпляра в методах, отличных от init..., dealloc и пар геттер / сеттер.Вместо этого используйте свойства.
  3. Не беспокойтесь о проверке nil - здесь это не имеет значения (сообщения nil возвращают ноль для всех неструктурных типов возврата).
  4. Убедитесь, что выпонять правила управления памятью.Если вы компилируете с включенным ARC: Расширенное руководство по программированию управления памятью ;В противном случае: Переход к примечаниям к выпуску ARC .
0 голосов
/ 08 февраля 2012

[NSKeyedUnarchiver unarchiveObjectWithData:data] возвращает автоматически освобожденный объект. Возможно, это ваша проблема. Постарайтесь сохранить результат, прежде чем использовать его. Проверка на nil не поможет вам, если переменная указывает на область памяти, которая содержит мусор, потому что она была автоматически освобождена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...