gri*_*eak 7 implementation casting dynamic objective-c void-pointers
+(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);
...
Run Code Online (Sandbox Code Playgroud)
我在最后一行收到错误,因为noteFactoryBLOCK被强制转换为void*而ARC不允许这样做.目前有办法实现我想要的吗?我想要一个IMP,我可以在运行时传递给class_addMethod.
编辑
IMP myIMP = imp_implementationWithBlock(objc_unretainedPointer(noteFactoryBLOCK));
Run Code Online (Sandbox Code Playgroud)
这条线给我一个警告而不是错误 - 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));
但那是相当丑陋的。
| 归档时间: |
|
| 查看次数: |
1503 次 |
| 最近记录: |