4

У меня есть некоторые операции, которые находятся внутри блоков. Это операция, только обновить UIImage так:Блоки внутри NSMutableArray утечки (ARC)

^(UIImage *image) { 
      self.myImage = image; 
     }]; 

Моим образом рассчитывается путем доступа к Интернет с NSURLConnection. Когда я получаю изображение из Интернета, я вызываю тот блок, который находится внутри NSMutableArray. Все идет нормально. Моя проблема в том, что, когда у меня есть несколько изображений, имеющих один и тот же URL-адрес, вместо того, чтобы делать несколько вызовов, я просто добавляю новый блок в NSMutableArray внутри класса, который обрабатывает соединение. Таким образом, я делаю один звонок и обновляю несколько изображений, которые используют URL. Все работает нормально, проблема в том, что я утечка блоков. Добавить блок, как это в NSMutableArray:

if((self = [super init])) 
    { 
     self.connectionURL=url; 
     self.arrayOfBlocks=[NSMutableArray array]; 
     [arrayOfBlocks addObject:completion]; 
    } 
    return self; 

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

[arrayOfBlocks addObject:completion]; 

Это когда я, наконец, получить обратный вызов и начать выполнение блоков:

for (MyBlock blockToExecute in arrayOfBlocks) 
    { 
     blockToExecute([UIImage imageWithData:data]); 
    } 

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


enter image description here

+1

Утечки на скриншоте не исходят из кода, который вы опубликовали. Это строки C-стиля, созданные функцией 'strdup()', глубоко в рамках. Я не думаю, что вы должны беспокоиться о них. Я думаю, что они либо ложные срабатывания, либо из-за ошибок в рамках. –

+0

На самом деле Кен, я наблюдал за приложением, и утечки все еще наступают, хотя блоки больше не используются (поскольку у вас уже есть изображения, вам больше не нужно их использовать) – Peres

ответ

6

Это хорошо известная утечка в инфраструктуре Apple. Это не вызвано использованием блоков.

Здесь a previous question об этом и bug report.

0

Блок сохраняет 'я', и я предполагаю, что 'я' сохраняет блоки (с помощью свойства 'arrayOfBlocks'). Если это свойство сохраняется, у вас есть круговая ссылка и утечка. Я не думаю, что ARC обрабатывает циклические ссылки, поэтому вам следует, вероятно, удалить массив блоков после того, как вы закончите с ним (или установите свойство в nil), и убедитесь, что ничто иное не ссылается на блоки.

+0

Итак, что вы предлагаете просто: self.arrayOfBlocks = nil? Потому что я пробовал и все еще течет. – Peres

+0

Кто-нибудь еще держит ссылки на этот массив, а кто-нибудь еще держит ссылки на эти блоки? –

+0

Нет, что массив нет. К блокам я так не думаю. Единственное, что я вижу, это: self.myImage = image; – Peres

Смежные вопросы