Mike Ash は、ブロックを使用してシートからのコールバックを処理する例を作成しました。これは非常に良さそうです。これは、beginSheet の別の SO の質問で、ユーザー Enchilada によるガベージ コレクションで動作するように更新されました: 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 で許可されていないというコンパイル エラーを回避できません。