Objective C运行来自另一个.mm文件的一个.mm文件中定义的'private'方法

时间:2016-09-07 20:45:25

标签: objective-c interface private objective-c++

在Obj-C中,有很多关于访问'私人'的问题(我从技术上讲,Obj-C中没有私有方法)。有很多问题解决了SomeClass的可见@interface声明了选择器'SomeMethod'。但是,没有一个能解决这两个问题。

所以这是一些代码。 Example.h

#import <Cocoa/Cocoa.h>

@interface Example : NSView

@end

Example.mm

#import "Example.h"
@interface Example()
- (void) printWordOne:(NSString*) firstWorld wordTwo:(NSString*) secondWord;
@end


@implementation Example

- (void)drawRect:(NSRect)dirtyRect {
    [super drawRect:dirtyRect];

    // Drawing code here.
}

- (void) printWordOne:(NSString*) firstWorld wordTwo:(NSString*) secondWord{
    NSLog(@"The two words are %@ %@", firstWorld, secondWord);
}

@end

ViewController.h

#import <Cocoa/Cocoa.h>
#import "Example.h"
@interface ViewController : NSViewController{
    IBOutlet Example *example;

}

@end

IBOutlet已在故事板中连接。

ViewController.mm

#import "ViewController.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // Do any additional setup after loading the view.
    [example printWordOne:@"Hello" wordTwo: @"World"];
}

- (void)setRepresentedObject:(id)representedObject {
    [super setRepresentedObject:representedObject];

    // Update the view, if already loaded.
}

@end

我遇到的问题是这个方法调用。 [example printWordOne:@"Hello" wordTwo: @"World"];

错误为No visible @interface for 'Example' declares the selector 'printWordOne:wordTwo'

我需要一种方法来调用该函数,而不在Example.h文件中声明它。如果我在#import Example.mm文件中ViewController.mm,我会收到以下信息:

duplicate symbol _OBJC_CLASS_$_Example in:
    /path/Example.o
    /path/ViewController.o
duplicate symbol _OBJC_METACLASS_$_Example in:
    /path/Example.o
    /path/ViewController.o
ld: 2 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我知道使用class_copyMethodList我可以获取方法列表并从ViewController.mm列出该方法。但无论如何都要执行该方法。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您可以使用ViewController.mm中的私有方法声明将类别声明为Example类:

#import "ViewController.h"

@interface Example()
- (void) printWordOne:(NSString*) firstWorld wordTwo:(NSString*) secondWord;
@end

@implementation ViewController
// ...
@end