Запутался в несоответствии отладчика с [NSBundle mainBundle] - PullRequest
0 голосов
/ 20 сентября 2009

Похоже, отладчик XCode подшучивал над мной за последние пару часов.

Я работал с этим кодом, который - задним числом - довольно очевидная ошибка, но она не была очевидна в то время:

- (UIImage*)loadBundleImage:(NSString*)imageName {   
    NSBundle* bundle = [NSBundle mainBundle];
    NSString* path = [bundle bundlePath];
    path = [path stringByAppendingFormat:@"%@/%@", path, imageName];
    return [UIImage imageWithContentsOfFile:path];
}

Я использовал отладчик для пошагового выполнения кода, и он продолжал говорить, что пакет был нулевым после вызова [NSBundle mainBundle]. Это заставило меня искать верх и низ в поисках причин, по которым это возможно, и пытаться решить эту проблему.

В конечном счете, я обнаружил фактическую ошибку (которая заключалась в том, что я добавлял путь дважды), поэтому я решил поэкспериментировать ... очевидно, комплект не был ноль, так почему отладчик говорит, что это было? При переходе по этому коду отладчик правильно отображает значение bundle после вызова mainBundle:

- (UIImage*)loadBundleImage:(NSString*)imageName {   
    NSBundle* bundle = [NSBundle mainBundle];
    if (bundle == nil) {
        NSLog(@"Nil bundle");
    }
    NSString* path = [bundle bundlePath];
    path = [path stringByAppendingFormat:@"/%@",imageName];
    return [UIImage imageWithContentsOfFile:path];
}

Итак, что здесь дает? Это ошибка с отладчиком? Мое единственное сомнительное предположение состоит в том, что компилятор оптимизирует последовательные вызовы mainBundle и bundlePath в какую-то атомарную операцию, поэтому отладчик не видит, что произошло ... но когда я прервал эти два вызова с блоком if ... который заставил компилятор работать с ними отдельно?!

Может кто-нибудь пролить свет на это? Я сумасшедший, как я себя чувствую? Пожалуйста, скажите мне, что я неправ, и я могу вернуться к доверию отладчику.

Спасибо, извините за мини-разглагольствование.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2009

Вы должны использовать stringByAppendingPathComponent: чтобы построить свой путь, а не помечать косые символы. У меня есть стандартная категория на UIImage, которая получает изображения из папки ресурсов:

+(UIImage*)imageFromResourceFileNamed:(NSString*)name;
{
if(!name) return nil;
NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:name];
return [[[UIImage alloc] initWithContentsOfFile:path] autorelease];     

}

Используйте это так:

UIImage *prettyImage = [UIImage imageFromResourceFileNamed:@"flower.png"];
0 голосов
/ 21 сентября 2009

Я вижу, что вы уже решили проблему, но в новейшей сборке XCode консоль отладчика должна сказать "переменная X была оптимизирована" при попытке распечатать ее в сборке выпуска.

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