我可以将应用程序用作库(Mac,Objective-c)吗?

时间:2011-05-11 23:47:14

标签: objective-c cocoa macos libraries

有没有办法从mac应用程序加载类,并在不同的mac应用程序中使用它们?

我想制作一个Automator动作来访问我的mac应用程序中的某些类,这似乎是我理想的方式(意味着你必须购买我的应用程序才能使用Automator)行动等。)

5 个答案:

答案 0 :(得分:4)

根据你想做的事情(我不太清楚),Service可能会为你做到这一点。您创建了一个帮助应用程序,可以使用共享的粘贴板在您的应用程序之间来回传递数据。您可以获得相当广泛的操作,因为您可以传递符合NSPasteboardWritingNSPasteboardReading协议的任何对象;正如文档中所述,NSStringNSAttributedStringNSURLNSColorNSSoundNSImage已经可用,当然,您可以编写一个完全符合您需求的自定义类。

答案 1 :(得分:4)

您是否尝试过创建独立的Automator插件项目,或尝试将Automator捆绑目标添加到应用程序的项目中?

我假设您要为主应用程序创建Automator操作,但不清楚如何使这些操作与您的应用程序(或应用程序中存在的类)进行交互。

Automator操作有3种基本类型:基于AppleScript,基于shell脚本和基于Objective-C。您很可能希望使您的基于Objective-C,这将允许您轻松地将主应用程序中的其他Objective-C代码合并到操作本身(请参阅Implementing an Objective-C Action)。 (请注意,默认情况下,为自动机包添加新目标时,它是AMAppleScriptAction类型。)

要了解与基于AppleScript的操作相比如何设置Objective-C自动机操作,您可能需要尝试创建单独的独立项目。

假设您的应用是基于文档的,并使用KWDocument类,该类公开名为-duplicateObjects:(NSArray *)objects toDocument:(KWDocument *)destDocument;的方法。您还有KWRegistrationManager知道您的应用是否已注册。而且假设你想要创建一个名为“Duplicate Objects to Document”的自动机器人动作。该操作将在KWDuplicateObjectsToDocument中实现,AMBundleActionNSPrincipalClass的子类。在将重复对象发送到Document.action的Info.plist中,KWDuplicateObjectsToDocument将为KWDuplicateObjectsToDocument.h

#import <Cocoa/Cocoa.h> #import <Automator/AMBundleAction.h> @interface KWDuplicateObjectsToDocument : AMBundleAction { } - (id)runWithInput:(id)input fromAction:(AMAction *)anAction error:(NSDictionary **)errorInfo; @end 看起来像:

KWDuplicateObjectsToDocument.m

你的#import "KWDuplicateObjectsToDocument.h" #import "KWDocument.h" #import "KWRegistrationManager.h" @implementation KWDuplicateObjectsToDocument - (id)runWithInput:(id)input fromAction:(AMAction *)anAction error:(NSDictionary **)errorInfo { if (![[KWRegistrationManager defaultManager] isRegistered]) { return nil; } // eventually you'll call // duplicateObjects:toDocument: return input; } @end 看起来像这样:

KWRegistrationManager

您需要确保编译并包含您使用的必要类(例如KWDocument,{{1}}等)作为此捆绑包的构建过程的一部分。

答案 2 :(得分:2)

你可以通过Applescript从你的应用程序中获取某些行为,但是以我认为你的意思是不可能访问实际的类。我的印象是,您的意思是访问加载到正在运行的应用程序内存中的类。这在OS X(或任何类UNIX系统)上是不可能的。应用程序在用户级别运行。用户级别的进程无法从其他进程读取内存。需要执行此类操作的操作系统组件在内核级别运行。

如果您只是尝试重用代码,则可以将要共享的部分构建到静态库中,其他人可以链接它并共享您的代码。

编辑:

从NSGod的回答看来,你可以使用相同的方法,通过Applescript访问它,并通过Obj-C访问它。这看起来很酷。

答案 3 :(得分:2)

看看distributed objects。您的应用程序可以提供Automator操作可以使用的一个或多个对象。我从未尝试过使用Automator,但它是一个非常优雅的系统,近年来并没有引起太多关注。我认为这绝对值得一看。

分布式对象的一个​​很酷的方面是,如果你愿意,应用程序可以在同一台计算机上运行,​​但它可以很容易地在另一台计算机上运行,​​甚至可能在很远的地方运行。

答案 4 :(得分:2)

基本上,不,你不能用可执行文件链接。

应用程序二进制文件采用特定格式。 并且该格式与静态或共享库格式不同。

这意味着您将无法从应用程序二进制文件加载任何代码部分,就像使用库一样。