NSString.длина дает EXC_BAD_ACCESS

#objective-c #cocoa #nsstring

#objective-c #какао #nsstring

Вопрос:

У меня есть следующий код:

 NSArray *array = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:nil];

NSString *temp;
for (int i = 0; i < [array count]; i  )
{
    temp = [array objectAtIndex:i];
    NSLog(@"temp length = %@", [temp length]);
}
 

Я получаю ошибку EXC_BAD_ACCESS в строке NSLog. Я предполагаю, что это ошибка в бите [temp length]. Странно то, что я могу использовать другие методы NSString для temp, и они работают нормально, например [temp characterAtIndex:0] .

Я также пытался это сделать [[array objectAtIndex:i] retain]; , но, похоже, это не помогает.

Кто-нибудь знает, почему я получаю эту ошибку?


РЕДАКТИРОВАТЬ: оказывается, в NSLog произошел сбой, потому что это был %@ вместо%lu. Реальная проблема заключалась в другом коде, который я опустил в этом сообщении. Поиграв с ним еще немного, я заставил его работать.

Комментарии:

1. Я предлагаю вам отметить ответ как правильный, учитывая, что они действительно ответили на ваш вопрос.

Ответ №1:

Насколько я понимаю, заполнитель «%@» предназначен для указателей на объекты, «длина» возвращает «NSUInteger», который не является указателем. Попробуйте использовать «%lu» вместо «%@».

Комментарии:

1. Это не исправило… Но что интересно, это привело к возникновению ошибки там, где находится вызов функции, а не на самой строке. Xcode также предложил %lu вместо %d, но оба сделали одно и то же.

Ответ №2:

Эта (слегка очищенная) версия работает для меня:

     NSError *error = nil;
    NSString *path = [@"~/Desktop" stringByExpandingTildeInPath];
    NSArray *array = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:
        path error:amp;error];
    if (error) NSLog(@"%@", error);

    for (NSString *path in array) {
        NSLog(@"Path length = %lu", path.length);
    }
 

Как упоминалось в thg435, «%@» предназначен для указателей на объекты, поэтому, если вы передадите ему произвольное число, оно выдаст ошибку доступа к памяти.