Я недавно узнал этот трюк, когда мне нужно ссылаться на я внутри блока.Захват Self в двойном блоке с ARC
__weak MyObject *safeSelf = self;
[self doWithCompletionBlock:^{
HMFInventoryBatchItemsController *strongSelf = safeSelf;
if (strongSelf) {
[strongSelf doSomethingElse];
}
}];
Но мне было интересно, что, если у меня есть блок внутри блока? Нужно ли снова делать то же самое?
__weak MyObject *safeSelf = self;
[self doWithCompletionBlock:^{
HMFInventoryBatchItemsController *strongSelf = safeSelf;
if (strongSelf) {
__weak MyObject *saferSelf = strongSelf;
[strongSelf doAnotherThingWithCompletionBlock:^{
HMFInventoryBatchItemsController *strongerSelf = saferSelf;
if (strongerSelf) {
[strongerSelf doSomethingElse];
}
}];
}
}];
Или это нормален
__weak MyObject *safeSelf = self;
[self doWithCompletionBlock:^{
HMFInventoryBatchItemsController *strongSelf = safeSelf;
if (strongSelf) {
[strongSelf doAnotherThingWithCompletionBlock:^{
[strongSelf doSomethingElse];
}];
}
}];
Почему переназначение себя с помощью HMFInventoryBatchItemsController * strongSelf = safeSelf; Так как сам является собственностью блока? –
Вам не нужно делать ссылку в блоке, если вы не хотите получить доступ к ее ivar. – Elden
Я нашел эту статью в качестве ссылки http://amattn.com/2011/12/07/arc_best_practices.html – Hackmodford