从另一个类,我如何调用在实现文件中声明但不在接口中声明的方法?

时间:2014-04-24 21:51:24

标签: objective-c

在本教程中:http://www.raywenderlich.com/62989/introduction-c-ios-developers-part-1

它提到了Objective-C:

  

即使你只在一个实现中声明了一个方法   类,并且不要在界面中公开它,技术上可以   仍在外部调用该方法。

这是怎么做到的?

2 个答案:

答案 0 :(得分:2)

有很多方法。

例如,只要将某个兼容方法声明为某处,就可以通过动态输入正常调用它。这是一个演示:

// MyClass.h
@interface MyClass : NSObject
@end

// MyClass.m
@interface MyClass()
- (void)addObject;
@end
@implementation MyClass
- (void)addObject:(id)object {
    NSLog(@"Whoa, I got called!");
}
@end

// main.m
#import <Foundation/Foundation.h>
#import "MyClass.h"

int main() {
    id something = [[MyClass alloc] init];
    [something addObject:@"Look ma, no errors!"];
    return 0;
}

由于有一个名为addObject:的已知方法接受一个对象,并且id变量是动态类型的,因此这是100%有效并将调用MyClass的addObject:方法。

他们甚至可以使用静态类型变量和通过在类别中声明方法而未知的方法来获取它。其他一些选择:

  • 使用performSelector:作为@michaels在答案中显示
  • 直接进入objc_msgSend()
  • 获取方法IMP并直接调用它。

答案 1 :(得分:0)

您可以使用NSObjectperformSelector:方法,但如果选择器未在任何地方公开声明,编译器会向您发出警告

[someObject performSelector:@selector(someMethod)];