在 Objective-C 中实现一种方法,组合插件

implementing one method from another in Objective-C, combining plugins

提问人:user3470496 提问时间:7/14/2020 最后编辑:user3470496 更新时间:7/15/2020 访问量:26

问:

我正在尝试组合两个用 Objective-C 编写的插件。我有 Plugin1 和 Plugin2,它们独立执行得足够好。我正在尝试将 Plugin2.m 代码添加到我的 Plugin1 Classes 文件夹并同时执行两者。

当我这样做时,Plugin1.m 似乎首先执行,我猜是因为它有 IBAction 调用而 Plugin2.m 没有?这很好,但我想在 Code1.m 中的函数中运行 Plugin2.m。因此,在下面的代码中,当 Plugin1 中的 IBAction 调用启动时,我希望它执行 Plugin2 通常执行的操作,然后继续使用 Plugin1 方法。

插件1.h:

#import Plugin2.h

@interface Plugin1: NSWindowController {
...
}
+(void) Plugin2;
@end

插件1.m:

#import "Plugin1.h"
#import "Plugin2.h"

@implementation Plugin1

-(id) loadPlugin1
{
...
}

-(IBAction) computeStuff:(id)sender
{
[self Plugin2];
//Plugin2* testRun = [Plugin2 alloc] init];

...do other stuff
}

@end

插件2.h

@interface Plugin2 : PluginFilter {
...
}
@end

插件2.m:

#import Plugin2.h

@implementation Plugin2

-(void) initPlugin
{
...
}

@end 

不幸的是,我无法从 Xcode 中解决这个问题,我必须在我的程序上安装并测试插件进行测试。但是当我密切关注控制台并尝试上述操作时,我得到“-[Plugin1 Plugin2]:无法识别的选择器发送到实例0x7....

Objective-C Xcode 函数 方法 插件

评论


答:

0赞 Ol Sen 7/15/2020 #1

在您定义的 plugin1 接口中

+(void)plugin2; 

但没有实现任何方法

+(void)plugin2 {

}

调用方法时,需要告诉从哪个类调用方法,因为 self 引用的是对象而不是类。+

[self.class plugin2];
// OR
[Plugin1 plugin2];

提示:尝试遵循 objective-c 中的命名约定。
这将帮助您区分定义是否为 or
-method:Class

考虑阅读有关设计模式和delegate<Protocols>

此外,在 Plugin2 实现中定义 special 并使用返回类型。否则,您将不初始化任何内容。-initPlugin

-(instancetype)initPlugin;