Проблема памяти с [NSData dataWithContentsOfFile]

Я разрабатываю приложение, которое потребовало кэширования изображения. Для того, чтобы сделать это, я пользуюсь библиотекой JMImageCache. Это, хорошо работают для кэширования. Но Это не может выпустить память, занятую следующая линия.

[NSData dataWithContentsOfFile]

Здесь, функция, какое содержание кодируют для изображения тайника от диска.

- (UIImage *) imageFromDiskForURL:(NSString *)url {
    NSData *data = [NSData dataWithContentsOfFile:cachePathForURL(url) options:0 error:NULL];
    UIImage *i = [[[UIImage alloc] initWithData:data] autorelease];
    data = nil;
    [data release];
    return i;
}

Я имею, согласовывают его с инструментами и этим alloc 2.34 МБ каждый раз.

0
nl ja de
Обучающие программы @H2CO3 сосут.... книги, хороший материал. Я не забываю тратить впустую 3 недели на обучающие программы YouTube, думая, ЧТО ЯВЛЯЕТСЯ ТЕМИ ASTERIKS ДЛЯ!?
добавлено автор MCKapur, источник
@H2CO3, Да верный, я всегда признаю ' tutorials' как видео обучающие программы, don' t знают почему.
добавлено автор MCKapur, источник
@RohanKapur I didn' t означают YouTube ' tutorials'. те - очень низкое качество наверняка. Письменный материал намного лучше.
добавлено автор user529758, источник
Вы находитесь в серьезной потребности 1. Получение схватывания на понятии ' sequences' (что-то очень простое и фундаментальное в программировании). 2. чтение хорошей Объективной-C обучающей программы. 3. Чтение Apple' s руководство управления памятью и изучение всех соглашений (не только называющий). У вас было 2 очень серьезных ошибки в 7 линиях кода. Я не мог бы хотеть устанавливать любое из ваших приложений, потому что я боюсь, что они в конечном счете сняли бы мое устройство...
добавлено автор user529758, источник

3 ответы

data = nil;
[data release];

Почему вы ожидаете, что это вообще будет работать? Почему это должно выпустить оригинальные данные? Вы посылаете выпуск сообщение, чтобы ноль , который является нет.

Кроме того, если вы не создаете объект, используя alloc или копия , тогда это автовыпущено. Это означает, выпускаете ли вы его еще раз, это будет сверхвыпущено, и скорее всего ваше приложение собирается потерпеть крах. То, в чем вы нуждаетесь:

Один. Оберните вызов метода в явный фонд автовыпуска:

- (UIImage *)imageFromDiskForURL:(NSString *)url
{
    UIImage *i;
    @autoreleasepool {
        NSData *data = [NSData dataWithContentsOfFile:cachePathForURL(url) options:0 error:NULL];
        i = [[UIImage alloc] initWithData:data];
    }
    return [i autorelease];
}

Два, alloc-init или вручную выпускают объект данных:

- (UIImage *)imageFromDiskForURL:(NSString *)url
{
    NSData *data = [[NSData alloc] initWithContentsOfFile:cachePathForURL(url) options:0 error:NULL];
    UIImage *i = [[[UIImage alloc] initWithData:data] autorelease];
    [data release];
    return i;
}
5
добавлено
@H2CO3 - Это won' t собирают с возвращением вне блока фонда автовыпуска. я не нахожусь в объеме, когда вы возвращаете автовыпущенный. Но да, it' ll ломаются, если вы возвращаетесь внутри туда. Необходимо объявить меня перед объемом фонда автовыпуска.
добавлено автор mattjgalloway, источник
+1, хорошее объяснение
добавлено автор Anoop Vaidya, источник
Спасибо @AKV.
добавлено автор user529758, источник
@PlayCool ' я приношу оператор возврата к autoreleasepool' - Почему, вы думаете я didn' t? ' причина это потерпело бы крах. Второй должен выпустить память - если данные не сохраняются изображением (который довольно возможен, действительно). Don' t пытаются предположить внутренности OS. Путем I' ve, показанный вас, является правом.
добавлено автор user529758, источник
@PlayCool, Но didn' t вы не читает ни моего ответа, ни моего комментария? НЕ ДЕЛАЮТ , помещает возвращение заявление в фонде автовыпуска.
добавлено автор user529758, источник
@mattjgalloway я признаю ошибку. I' ll редактируют его.
добавлено автор user529758, источник
@H2CO3 благодарит за ваш ответ, я пробую оба из вышеупомянутых. В праве преимущественной покупки я приношу оператор возврата в "@autoreleasepool", но это дает мне BadExcess, используя это изображение.
добавлено автор Play cool, источник
второй вариант doesn' t выпускают память.
добавлено автор Play cool, источник
@H2CO3, Если я беру ' возвратите i' в autoreleasepool это дает мне ошибку времени компиляции.
добавлено автор Play cool, источник
@H2CO3 хорошо я удалил возвращение из фонда автовыпуска
добавлено автор Play cool, источник
добавлено автор Play cool, источник

измените ноль последовательности и выпуск

[data release];
data = nil;

и для прояснения использования тайника после методов делегата

[[JMImageCache sharedCache] removeAllObjects];
[[JMImageCache sharedCache] removeImageForURL:@"http://dundermifflin.com/i/MichaelScott.png"];

read the read me file of library https://github.com/jakemarsh/JMImageCache/blob/master/README.markdown

1
добавлено
Я думаю, что ответ H2CO3 намного лучше, чем я, и прохладная Игра первоначально не ассигнует память, это - мелкая копия памяти. выглядит, что оригинальная ассигнованная память где-то в другом месте.
добавлено автор AsifHabib, источник
@Playcool: пойдите в github.com/jakemarsh/JMImageCache/blob/master/… загрузите почтовый индекс и откройте JMImageCacheDemo.xcodeproj в XCode. теперь откройте файл DemoViewController.m и пойдите к делегату стола, funtion DidselectRowAtIndexPath теперь добавляет эту линию [[JMImageCache sharedCache] removeAllObjects]; и управляйте проектом....., как только он займет время, чтобы загрузить все изображения, после этого все это, изображения будут видимы. тогда выберите любой ряд, выбирающий любой ряд, очистит данные из тайника и теперь немногих, пункт перезагрузит. проверьте его
добавлено автор AsifHabib, источник
Если you' ре, выполняющее это, это потерпит крах. Это сверхвыпускает.
добавлено автор user529758, источник
Я попробовал его, но это не работает.
добавлено автор Play cool, источник

То, что вы пытаетесь сделать, не может работать из-за пути, как UIImage использует данные, вы передаете его. Объект данных сохраняется изображением, или более точно CGImageSource, который UIImage имеет внутренне. От этих данных это в состоянии развернуть и создать изображение любое время. Есть выбор на CGImageSource, чтобы также иметь в наличии развернутые данные, но UIImage не использует это, потому что это оптимизировало для маленькой графики UI.

Одна вещь, которую можно сделать, чтобы облегчить давление памяти, не состоит в том, чтобы загрузить весь NSData в память, но к карте распределения памяти оно вместо этого. Это делает создание или отдых изображения немного медленнее, но созданный объект NSData очень маленький в сравнении.

0
добавлено
Пожалуйста, посмотрите на documentwtion для NSData.
добавлено автор Cocoanetics, источник
спасибо за ваш ответ, но может вы экс-самолет это с примером
добавлено автор Play cool, источник