我有一个带有需要从类内外调用的函数的类。下一个代码工作正常,但我想知道,有没有办法只有一个lowerKeyboard
方法而不是两个方法 - 和+?
如果我只保留+方法,那么在尝试从类中调用方法时会出现错误unrecognized selector sent to instance
从课堂内部开始:
-(void)someOtherMethod
{
UIBarButtonItem *infoButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(lowerKeyboard)];
}
来自课外:
[myClass lowerKeyboard];
MyClass的:
-(void)lowerKeyboard
{
//do something
}
+(void)lowerKeyboard
{
//do the exact same thing
}
答案 0 :(得分:3)
说你有以下内容:
- (void)doFoo
{
NSLog(@"Foo");
}
+ (void)doFoo
{
NSLog(@"Foo");
}
您可以将其重构为执行以下两种实现:
- (void)doFoo
{
[[self class] doFoo];
}
+ (void)doFoo
{
NSLog(@"Do Foo!");
}
然而,值得指出的是,有两个这样类似命名的方法就是在寻找麻烦。您最好不要删除两个接口中的一个以避免混淆(特别是因为您只需要一个实现副本!)。
糟糕的建议如下 - 除非你真的知道如何搞乱运行时间,否则不要这样做(我不会。)
从技术上讲,您可以通过编辑运行时来复制类实现和实例实现,如下所示:
// Set this to the desired class:
Class theClass = nil;
IMP classImplementation = class_getImplementation(class_getClassMethod(theClass, @selector(doFoo)));
class_replaceMethod(theClass, @selector(doFoo), classImplementation, NULL)
这应该确保调用+ [theClass doFoo]调用与调用 - [theClass doFoo]完全相同的实现。它完全从类的实现栈中删除了原始实例实现(因此请谨慎处理)。但是,我无法想到任何真正合法的案例,所以请用一点点盐来对待它!
答案 1 :(得分:0)
-(void)lowerKeyboard
{
//this can be called on class instance
//UIBarButtonItem *infoButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(lowerKeyboard)];
//[infoButtonItem lowerKeyboard];
}
+(void)lowerKeyboard
{
//this can be used as class static method
//you cannot use any class properties here or "self"
//[UIBarButtonItem lowerKeyboard];
}