beginSheet: блочная альтернатива с ARC?

Mike Ash создал пример использования блоков для обработки обратных вызовов из листов, который кажется очень хорошим. В свою очередь он был обновлен для работы со сборкой мусора пользователем Enchilada в другом вопросе SO на beginSheet: block alternative?, см. ниже.

@implementation NSApplication (SheetAdditions)

- (void)beginSheet:(NSWindow *)sheet modalForWindow:(NSWindow *)docWindow didEndBlock:(void (^)(NSInteger returnCode))block
{  
  [self beginSheet:sheet
    modalForWindow:docWindow
     modalDelegate:self
    didEndSelector:@selector(my_blockSheetDidEnd:returnCode:contextInfo:)
       contextInfo:Block_copy(block)];
}

- (void)my_blockSheetDidEnd:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
{
  void (^block)(NSInteger returnCode) = contextInfo;
  block(returnCode);
  Block_release(block);
}

@end

Несмотря на включение GC, это не работает с автоматическим подсчетом ссылок (ARC). Я сам, будучи новичком в ARC и блоках, не могу заставить его работать. Как я должен изменить код, чтобы он работал с ARC?

Я понимаю, что нужно сделать Block_release(), но я не могу преодолеть ошибки компиляции о том, что приведение 'void *' к 'void (^)(NSInteger)' запрещено с ARC.

6
задан Community 23 May 2017 в 10:28
поделиться