Добавяне: проблемът се случва, когато копирам блока във функцията: [block copy]
Вече използвам __блок, за да избегна самозадържане. __блок типof (самостоятелно) bself = самостоятелно;
Когато обаче има друг блок в този блок и той използва belves, себе си все пак ще бъде запазен.
Както показва в кода по-долу, първият bself няма да се задържи, както се очаква. Въпреки това, 2-рата собственост ще запази себе си.
__block typeof(self) bself = self;
[layer start:param1
completeHanlder:^{
bself.xx = localxx;
dispatch_async(dispatch_get_main_queue(), ^(void) {
... ...
[bself something];
});
}
];
някой знае защо?
Отговори:
-1 за отговор № 1Правите грешно, но концепцията е прав, тук грешката:
__block
Това се използва, за да дадете силна референция във вашия блок. Бихте могли например да промените стойността извън блока си.
Правилният начин е да правите с __weak, който ще получи слаба справка от вашия инстанция и ще предотврати силна циклична линия като тази:
__weak typeof(self) bself = self;
И тъй като __block, че сте създали задържане и силна справка :)