приведение блока к пустоте * для разрешения метода динамического класса - PullRequest
7 голосов
/ 15 июня 2011
+(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 приведен к пустоте *, а ARC запрещает это.Есть ли в настоящее время способ выполнить то, что я хочу?Я хотел бы получить IMP, который я могу передать class_addMethod во время выполнения.

EDIT

    IMP myIMP = imp_implementationWithBlock(objc_unretainedPointer(noteFactoryBLOCK));

Эта строка выдает мне предупреждение вместо ошибки - Semantic Issue: Passing 'objc_objectptr_t' (aka 'const void *') to parameter of type 'void *' discards qualifiers

1 Ответ

3 голосов
/ 03 августа 2011

Мне неприятно это говорить, но в этом случае вам, возможно, придется просто выбросить const.

IMP myIMP = imp_implementationWithBlock((void*)objc_unretainedPointer(noteFactoryBLOCK));

Хотя это довольно уродливо.

...