【发布时间】:2015-05-11 15:46:29
【问题描述】:
我正在尝试用我自己的实现替换 UIImage 的类方法。
在某些情况下,我的实现可能只想调用原始 UIImage 实现。
这是我的代码
#import "UIImage+SkinnedImage.h"
#import <objc/runtime.h>
@interface UIImage (SkinnedImagePrivate)
+ (UIImage *)originalImageNamed:(NSString*)name;
@end
@implementation UIImage (SkinnedImage)
+ (void)allowSkinning {
Method imageNamedMethod = class_getClassMethod([UIImage class], @selector(imageNamed:));
IMP originalImageNamedIMP = class_getMethodImplementation_stret([UIImage class], @selector(imageNamed:));
Method swizzled = class_getClassMethod([UIImage class], @selector(skinnedImageNamed:));
method_exchangeImplementations(imageNamedMethod, swizzled);
const char *signatureEnconding = method_getTypeEncoding(imageNamedMethod);
class_addMethod([UIImage class], @selector(originalImageNamed:), originalImageNamedIMP, signatureEnconding);
}
+ (UIImage *)skinnedImageNamed:(NSString *)name {
//XXX
return [UIImage originalImageNamed:name];
}
@end
-
+ (void)allowSkinning被调用。 -
调用
+ (UIImage *)skinnedImageNamed:(NSString *)name而不是+ (UIImage *)imageNamed:(NSString *)name; -
return [UIImage originalImageNamed:name];崩溃错误:
原因:'+[UIImage originalImageNamed:]:无法识别的选择器发送到 类
为什么 class_addMethod([UIImage class], @selector(originalImageNamed:), originalImageNamedIMP, signatureEnconding);未能为我提供实现?
请注意函数class_addMethod返回true
【问题讨论】:
-
在
Other Linker Flags下的构建设置中添加-ObjC标志 -
@Wongzigii 我已经拥有了它
标签: objective-c introspection objective-c-runtime