Então eu tenho esse trecho aqui que envolve um bloco:
NSArray<Class> *acceptableClasses = @[[DesktopEntity class]];
__block NSInteger insertIdx = row;
[info enumerateDraggingItemsWithOptions:0 forView:_tableView classes:acceptableClasses searchOptions:nil usingBlock:^(NSDraggingItem *draggingItem, NSInteger idx, BOOL *stop)
{
DesktopEntity *entity = draggingItem.item;
[_tableContents insertObject:entity atIndex: insertIdx];
[_tableView insertRowsAtIndexes:[NSIndexSet indexSetWithIndex:insertIdx] withAnimation:NSTableViewAnimationEffectGap];
draggingItem.draggingFrame = [_tableView frameOfCellAtColumn:0 row: insertIdx];
++insertIdx;
}];
compila bem, mas estou recebendo um aviso:
O bloco retém implicitamente 'self'; menciona explicitamente 'self' para indicar que este é o comportamento pretendido
Estou com alguma dificuldade para entender o que isso significa . Consegui fazer o aviso desaparecer apenas digitando a palavra-chave self antes das variáveis:
[self.tableContents insertObject:entity atIndex: insertIdx];
[self.tableView insertRowsAtIndexes:[NSIndexSet indexSetWithIndex:insertIdx] withAnimation:NSTableViewAnimationEffectGap];
draggingItem.draggingFrame = [self.tableView frameOfCellAtColumn:0 row: insertIdx];
++insertIdx;
Mas também vi pessoas usando construções como
__weak typeof(self) weakSelf = self;
e então usar esse 'weakSelf' em vez disso, qual é a diferença aqui e minha primeira abordagem está errada?