Я прочитал замечательную статью, написанную benzado о том, что использование блока приведет к утечке памяти, если у нас есть переменная класса, сохраняющая сам блок, а блок сохраняет «я», что вызывает цикл сохранения.
Как мне избежать захвата себя в блоках при реализации API?
Но я не понимаю, почему использование GCD вызовет ту же проблему? такие функции, как dispatch_async(), выглядят для меня как локальная переменная, которая не должна захватываться самим классом?
А в официальном документе говорилось, что мы должны поставить автовыпуск в блоки, чтобы наши объекты освобождались вовремя.
В большей части моего проекта IOS я использую GCD следующим образом:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,(unsigned long)NULL), ^(void) {
NSDictionary *resultDic = [MyService loadData];
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate useData:resultDic];
});
});
Теперь мне нужно изменить их все на
__block MyClass *blockSelf = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,(unsigned long)NULL), ^(void) {
@autoreleasepool{
NSDictionary *resultDic = [MyService loadData];
dispatch_async(dispatch_get_main_queue(), ^{
@autoreleasepool{
[blockSelf.delegate useData:resultDic];
}
});
}
});
??
Это выглядит грязным. Кто-нибудь знает, как это сделать правильно?
Кстати, если я вызвал некоторые функции в блоке и использовал в этих функциях «self» или «self.delegate», значит ли это, что мне нужно изменить все это на что-то другое? (и я не знаю, что делать, чтобы это исправить)
К вашему сведению, мой проект IOS создан в среде IOS8.1 и не-ARC.
@autoreleasepool
, потому что это не нарушает циклы сохранения. - person Tommy   schedule 06.02.2015