Установка сильной NSBlockOperation на UIWebView. Это плохая идея?

Я отлаживаю интересную проблему с моим приложением.

Приложение ориентировано на iOS6.1 и использует ARC. Вот некоторый фон, так как он слишком большой, чтобы скопировать вставку в SO.

Есть класс Dashboard, у которого есть дочерний контроллер представления. Этот дочерний контроллер представления довольно большой, у него есть кнопки двух видов прокрутки, которые создаются динамически на основе объекта CoreData, который ему передает контроллер панели мониторинга. Когда контроллер панели мониторинга выполняется с дочерним контроллером, он уничтожает его и создает другой с другим объектом данных ядра.

Одно из представлений в дочернем контроллере, которое динамически создается и вставляется в UIScrollView, является подклассом UIWebView. Давайте назовем это SubWeb. Когда создается экземпляр SubWeb, он использует блок NSOperationBlock для выборки некоторых файлов по сети вместе с некоторыми другими вещами (запись на диск, шифрование и т. Д.). Как только это будет сделано, он должен иметь возможность вставить файл или веб-страницу в экземпляр SubWeb.

Я решил для этого, давая SubWeb сильное свойство. Это моя проблема: моя очистка никогда не сможет уничтожить дочерний контроллер представления или SubViews; Я подтвердил это с помощью исследования распределения инструментов, которое предназначено для моих классов. Создав и уничтожив дочерние контроллеры представления (и объекты SubWeb), я могу наблюдать за выделением памяти для дочернего контроллера представления и объектов Sub wWeb вверх по лестнице, пока не произойдет сбой приложения. Странно то, что когда я устанавливаю NSBlockOperation в слабое состояние, процедура уничтожения делает то, что я ожидаю.

Мне нужна сильная ссылка, потому что я запускаю только несколько объектов SubWeb с реальным файлом для запуска, затем, если пользователь прокручивает их, я лениво загружаю нужный файл, нажимая свойство, которое

Вот WebView, на который я ссылаюсь, когда дочерний контроллер представления и экземпляры представления SubWeb не очищены:

#import <UIKit/UIKit.h>

@interface MySubWebView : UIWebView

@property (strong) NSBlockOperation *fileLoadOperation;

@end

Вот WebView, когда он очищен (Но - теперь ленивые операции Blocak обнуляются, когда они мне нужны:

#import <UIKit/UIKit.h>

@interface MySubWebView : UIWebView

@property (weak) NSBlockOperation *fileLoadOperation;

@end

Разница только в сильном и слабом типе. Кто-нибудь когда-либо использовал NSBLockOperation для этого типа ленивого действия загрузки? Есть ли другой / лучший способ, который я мог бы использовать, чтобы решить ленивую нагрузку?

1 ответ

Решение

Я не следую вашей логике для создания NSBlockOperation объект strong, Как правило, должно быть weak, Если операция завершается, нет смысла оставлять объект операции больше.

В ответ на вопрос о потреблении памяти у вас заканчивается память, потому что у вас, несомненно, есть сильный референтный цикл (он же цикл сохранения). Если блок имеет ссылку на self (будь то явно или неявно, ссылаясь на некоторые переменные экземпляра вашего контроллера), вы можете получить цикл сильных ссылок (то есть два объекта, которые поддерживают сильные ссылки друг на друга, и, таким образом, ни один из них никогда не будет освобожден, если вы не очистите его вручную.)

Сведения о циклах сохранения см. В разделе " Использование слабых ссылок для избежания циклов сохранения" в Руководстве по программированию расширенного управления памятью. Также см. Избегайте сильных эталонных циклов при захватеself в руководстве по программированию с Objective-C.

Другие вопросы по тегам