Справка по ошибке при сбое NSString - PullRequest
0 голосов
/ 19 февраля 2011

У меня есть код, который выглядит следующим образом:

NSString *_parse = [NSString stringWithFormat:@"//%@",_user];
NSString *_status = [Parser parse:_parse:@"status"]; //parses the xml
if ([_status isEqualToString:@"1"]) { //error here
}

Приложение аварийно завершает работу, когда проверяет, равны ли строки. Тем не менее, это прекрасно работает, когда я заменяю первую строку кода на это:

    NSString *_parse = [NSString stringWithFormat:@"//user1"];

Но это не использует "пользовательский" ivar, который мне нужно использовать, потому что значение может быть другим. Ivar "user" - это строка NSString, объявленная ранее с [self setUser:@"userX"]; Что я должен сделать, чтобы это исправить? Спасибо

РЕДАКТИРОВАТЬ: Вот код, который анализирует XML:

+ (NSString *)dataFilePath:(BOOL)forSave {

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *documentsPath = [documentsDirectory stringByAppendingPathComponent:@"hangout.xml"];
            return documentsPath;    
    }
    + (MyViewController *)parse:(NSString *)nodesForPath:(NSString *)elementsForName {

        NSString *filePath = [self dataFilePath:FALSE];
        NSData *xmlData = [[NSMutableData alloc] initWithContentsOfFile:filePath];
        NSError *error;
        GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:xmlData options:0 error:&error];
        if (doc == nil) { return nil; }
        MyViewController *view = [[[MyViewController alloc] init] autorelease];
        NSArray *getVersionInfo = [doc nodesForXPath:nodesForPath error:nil];
        for (GDataXMLElement *versionInfo in getVersionInfo) {
            NSArray *elm1 = [versionInfo elementsForName:elementsForName];
            GDataXMLElement *elm2 = (GDataXMLElement *) [elm1 objectAtIndex:0];
                return elm2.stringValue;
        }

        [doc release];
        [xmlData release];
        return view;
    }

1 Ответ

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

Основная проблема в вашем parse:nodesForPath:elementsForName: методе.Когда вы находите искомый элемент, он возвращает NSString (внутри цикла).Когда вы не не находите искомый элемент, он выходит из цикла и возвращает экземпляр MyViewController.Очевидно, что вы не можете сравнивать контроллер представления со строкой, так что это приводит к падению.Зачем тебе это делать?Он нигде не используется, прежде чем вернуть его.Нет смысла иметь этот код там.Вырежьте ссылки на MyViewController полностью.Верните nil из вашего parse:nodesForPath:elementsForName: метода.Не возвращайтесь преждевременно в цикле, не освободив выделенную память, иначе эта память утечет.Есть и еще одна утечка в вашем предыдущем возвращении.

...