在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
列出该方法。但无论如何都要执行该方法。
非常感谢任何帮助。
答案 0 :(得分:1)
您可以使用ViewController.mm中的私有方法声明将类别声明为Example
类:
#import "ViewController.h"
@interface Example()
- (void) printWordOne:(NSString*) firstWorld wordTwo:(NSString*) secondWord;
@end
@implementation ViewController
// ...
@end