例如,类方法和类方法相同。可能?

时间:2013-10-01 14:01:56

标签: ios objective-c ios5 ios6

我有一个带有需要从类内外调用的函数的类。下一个代码工作正常,但我想知道,有没有办法只有一个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
}

2 个答案:

答案 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];
}