#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, «%@» предназначен для указателей на объекты, поэтому, если вы передадите ему произвольное число, оно выдаст ошибку доступа к памяти.