Сбой при использовании слабого объекта в блоке - PullRequest
0 голосов
/ 14 мая 2018

Мой код такой:

Member *member = [Member new];
__weak __typeof(self) weakSelf = self
member.gotoPageBlock = ^(NSString *url) {
    __strong __typeof(weakSelf) self = weakSelf
    [self goToPageWithURL:[NSURL URLWithString:url]];
};

Это редко приводит к аварийному завершению, и верхний стек этого аварийного сброса выглядит так:

Exception Type:  SIGSEGV
Exception Codes: SEGV_ACCERR at 0x365722298
Triggered by Thread:  0
Thread 0 Crashed:
0   libobjc.A.dylib                 0x0000000182794bb4 _objc_loadWeakRetained :156 (in libobjc.A.dylib)

Сбой происходит при выполнении блока.
Кто-нибудь знает, что случилось?

1 Ответ

0 голосов
/ 14 мая 2018

Создание сильного Я снова не нужно, поэтому удалите эту строку __strong __typeof(weakSelf) self = weakSelf, и тогда она должна работать правильно

Используйте это

Member *member = [Member new];
__weak __typeof(self) weakSelf = self
member.gotoPageBlock = ^(NSString *url) {
    //the difference is here
    [weakSelf goToPageWithURL:[NSURL URLWithString:url]];
};

отметьте это https://sectionfive.net/blog/2014/11/24/arc-exploration-and-pitfalls/ в Потеря права собственности при выполнении раздела для получения дополнительной информации

...