将参数传递给动态方法的问题(object_addMethod)

时间:2014-03-10 18:08:42

标签: objective-c objective-c-runtime

我正在尝试使用resolveClassMethod:object_addMethod添加新方法。事情似乎总体上运作良好,但参数似乎没有通过。

当我传入参数时,例如:

UIFont *font1 = [UIFont academyEngravedLetPlainOfSize:12.0f];

我的动态方法中的字体大小为0.0而不是12.0。以下是以下示例的输出:

createNamedFontIMP(UIFont, academyEngravedLetPlainOfSize:, 0.000000)

我在这里做错了什么?

@interface UIFont (NTNamedFonts)

+(UIFont *)academyEngravedLetPlainOfSize:(int)size NS_AVAILABLE_IOS(6_0);

@end

@implementation UIFont (NTNamedFonts)

NSString *targetSelectorName = @"academyEngravedLetPlainOfSize:";
NSString *targetFontName = @"AcademyEngravedLetPlain";

+(BOOL)resolveClassMethod:(SEL)sel
{
    NSString *selectorName = NSStringFromSelector(sel);

    if ( [selectorName isEqualToString:targetSelectorName] )
    {
        Class metaClass = object_getClass(self);
        class_addMethod(metaClass, sel, (IMP)createNamedFontIMP, "@#:f");
        return YES;
    }
    else
        return [super resolveClassMethod:sel];
}

static id createNamedFontIMP(Class class, SEL _cmd, CGFloat size)
{
    NSLog(@"createNamedFontIMP(%@, %@, %f)", NSStringFromClass(class), NSStringFromSelector(_cmd), size);

    UIFont *font = [class fontWithName:targetFontName size:size];

    return font;
}

@end

1 个答案:

答案 0 :(得分:0)

将整数传递给float。请显示方法声明。

BTW:你的代码是什么原因?一个类别似乎是更好的方法。

BTW 2:如果我没记错的话,你必须使用双倍。