将一个块投射到void *以获得动态类方法解析
+(BOOL)resolveClassMethod:(SEL)aSel {
NSString *lString = NSStringFromSelector(aSel);
if ([self validateLetterAndAccidental:lString]) {
id (^noteFactoryBLOCK)(id) = ^(id aSelf) {
return [self noteWithString:lString];
};
IMP lIMP = imp_implementationWithBlock(noteFactoryBLOCK);
...
我在最后一行得到一个错误,因为noteFactoryBLOCK被转换为void *,ARC不允许这样做。 目前有什么方法可以完成我想要的? 我想要一个可以在运行时传递给class_addMethod的IMP。
编辑
IMP myIMP = imp_implementationWithBlock(objc_unretainedPointer(noteFactoryBLOCK));
这条线给我一个警告,而不是一个错误 - Semantic Issue: Passing 'objc_objectptr_t' (aka 'const void *') to parameter of type 'void *' discards qualifiers
我讨厌这样说,但在这种情况下你可能只需要抛弃const。
IMP myIMP = imp_implementationWithBlock((void*)objc_unretainedPointer(noteFactoryBLOCK));
虽然这很丑陋。
链接地址: http://www.djcxy.com/p/7805.html上一篇: casting a block to a void* for dynamic class method resolution