2

我有一个类,它的函数需要从类的内部和外部调用。下一个代码工作正常,但我想知道,有没有办法只使用一种lowerKeyboard方法而不是使用 - 和 + 的两种方法?如果我只保留 + 方法,我会unrecognized selector sent to instance在尝试从类内部调用该方法时出错

从课堂内部:

-(void)someOtherMethod
{
    UIBarButtonItem *infoButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone  target:self action:@selector(lowerKeyboard)];
}

从课外:

[myClass lowerKeyboard];

我的课:

-(void)lowerKeyboard
{
    //do something

}

+(void)lowerKeyboard
{
        //do the exact same thing
}
4

2 回答 2

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] 完全相同的实现。它从类的实现堆栈中完全删除了原始实例实现(因此请谨慎处理)。但是,我想不出任何真正合法的案例,所以请用少许盐来处理!

于 2013-10-01T14:15:34.030 回答
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];
}
于 2013-10-01T14:08:25.633 回答