将一个块投射到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

下一篇: How to create cookie before open() in Selenium