Загрузка изображений в NSArray с использованием initWithObjects дает сбой, но не с NSMutableArray? - PullRequest
3 голосов
/ 26 января 2010

Я выполняю ленивую загрузку изображений в массив после загрузки приложения. Я попытался использовать NSMutableArray и NSArray (мне не нужно изменять массив после того, как он был создан), но последний вылетает на мне.

...
[self performSelectorInBackground:@selector(loadImageArrays) withObject:nil];
...

- (void)loadImageArrays {

    NSAutoreleasePool *pool;
    pool = [[NSAutoreleasePool alloc] init];
    NSString *fileName; 

    imageArray = [[NSMutableArray alloc] init];
    for(int i = 0; i <= x; i++) {
        fileName = [NSString stringWithFormat:@"image_0000%d.png", i];
        [imageArray addObject:[UIImage imageNamed:fileName]];
    }
    [pool drain];
}

против

NSAutoreleasePool *pool;
pool = [[NSAutoreleasePool alloc] init];
imageArray = [[NSArray alloc] initWithObjects:
            [UIImage imageNamed:@"image_00000.png"],
            [UIImage imageNamed:@"image_00001.png"],
            [UIImage imageNamed:@"image_0000X.png"],
                    nil];
[pool drain];

NSZombieEnabled = YES говорит мне, что [UIImage retain] был отправлен на освобожденный экземпляр при использовании последнего фрагмента кода. Оба массива имеют (неатомное, сохраняющее) свойство в моем h-файле. Почему изображения не сохраняются NSArray?

Ответы [ 2 ]

4 голосов
/ 26 января 2010

UIImage является частью UIKit, которая не является поточно-ориентированной. Например, метод imageNamed: может повредить глобальный словарь имен и изображений, который класс UIImage использует для кэширования.

Вы должны использовать Core Graphics, если вы хотите загрузить изображения в фоновом потоке.

Редактировать , чтобы ответить на ваш комментарий:

PNG-файлы можно загружать с помощью:

CGDataProviderRef source = CGDataProviderCreateWithURL((CFURLRef)url);
CGImageRef image = CGImageCreateWithPNGDataProvider(source, NULL, NO, kCGRenderingIntentDefault);
CFRelease(source);

A CGImage является базовым базовым объектом и может храниться в NSArray. Затем вы можете сделать из него UIImage (конечно, в главном потоке):

[[UIImage alloc] initWithCGImage:image]
0 голосов
/ 26 января 2010

Хотя я знаю, что существует большая разница в изменяемых и неизменяемых массивах, я сам сомневаюсь. Что-то подсказывает мне, что это не просто изменчивая и неизменная проблема. Похоже, ваш бассейн истощен преждевременно (звучит противно). Не то чтобы это имело значение, но вы могли бы попытаться создать новый поток, выполнив;

[NSThread detachNewThreadSelector:@selector(loadImageArrays) toTarget:self withObject:nil];

Мне просто любопытно, что получится. Также попробуйте оба фрагмента в чистой среде (т. Е. Без кода) Если ваш второй фрагмент кода работает там, вы должны искать решение в другом месте.

...