Cocoa/PyObjC 分布式对象缺少一些东西
Posted
技术标签:
【中文标题】Cocoa/PyObjC 分布式对象缺少一些东西【英文标题】:Missing something for Cocoa/PyObjC Distributed Objects 【发布时间】:2011-01-27 14:11:21 【问题描述】:我正在尝试使用带有 PyObjC 的分布式对象制作一个简单的示例。在服务器端我有(在 Xcode 中):
class VendedObject(NSObject):
@objc.signature('@24@0:')
def speak(self):
return 'woof'
class TalkAppDelegate(NSObject):
def applicationDidFinishLaunching_(self, sender):
NSLog("Application did finish launching.")
conn = NSConnection.defaultConnection()
NSLog("Creating connection")
obj = VendedObject.alloc().init()
print obj.description()
conn.setRootObject_(obj)
result = conn.registerName_("my_server")
if not result:
NSLog("Failed to register Name")
#conn.setDelegate_(self)
NSLog(conn.description())
当我运行它时,我得到:
2011-01-27 10:27:55.695 Talk[34432:a0f] Application did finish launching.
2011-01-27 10:27:55.698 Talk[34432:a0f] Creating connection
<VendedObject: 0x3e45970>
2011-01-27 10:27:55.701 Talk[34432:a0f] (** NSConnection 0x28f2030 receivePort <NSMachPort: 0x28f2160> sendPort <NSMachPort: 0x28f2160> refCount 2 **)
在客户端我有:
class ListenAppDelegate(NSObject):
def applicationDidFinishLaunching_(self, sender):
NSLog("Application did finish launching.")
proxy_obj = NSConnection.rootProxyForConnectionWithRegisteredName_host_(
"my_server", None)
if not proxy_obj:
print 'Did not get an object from the server.'
else:
print proxy_obj.description()
print proxy_obj.speak()
我明白了:
2011-01-27 10:28:35.821 Listen[34460:a0f] Application did finish launching.
<VendedObject: 0x3e45970>
2011-01-27 10:28:35.829 Listen[34460:a0f] -[OC_PythonString initWithBytes:length:encoding:]: unrecognized selector sent to instance 0x3635130
2011-01-27 10:28:35.832 Listen[34460:a0f] -[OC_PythonString initWithBytes:length:encoding:]: unrecognized selector sent to instance 0x3635130
我错过了什么但不知道是什么?
编辑:修改为使用我认为正确的签名,并显示出现的新问题。 谢谢。
【问题讨论】:
【参考方案1】:回答我自己的问题,抱歉。这似乎是 PyObjC 的问题。我用 Objective-C 重写了服务器:
#import "VendAppDelegate.h"
@interface VendedObject:NSObject
-(NSString *) speak;
@end
@implementation VendedObject
-(NSString *) speak
return @"woof";
@end
@implementation VendAppDelegate
@synthesize window;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
NSAutoreleasePool *pool ;
pool = [[NSAutoreleasePool alloc] init];
VendedObject *obj;
obj = [[[VendedObject alloc ] init] autorelease];
NSLog(@"%@", [obj description]);
NSConnection *conn;
conn = [[[NSConnection alloc] init] autorelease];
[conn setRootObject:obj];
BOOL result;
result = [conn registerName:@"my_server"];
if (!result)
NSLog(@"Failed to register Name");
else
NSLog(@"%@", [conn description]);
[pool drain];
@end
并使用此输出运行它:
2011-01-27 11:45:14.252 Vend[36530:a0f] <VendedObject: 0x1001326f0>
2011-01-27 11:45:14.254 Vend[36530:a0f] (** NSConnection 0x1004527f0 receivePort <NSMachPort: 0x100452a80> sendPort <NSMachPort: 0x100452a80> refCount 1 **)
我用 Python 做这个:
from Foundation import *
proxy_obj = NSConnection.rootProxyForConnectionWithRegisteredName_host_(
"my_server", None)
if not proxy_obj:
print 'Did not get an object from the server.'
else:
print proxy_obj.description()
print type(proxy_obj)
print proxy_obj.speak()
输出:
<VendedObject: 0x1001326f0>
<objective-c class NSDistantObject at 0x7fff70a64868>
woof
【讨论】:
酷!我尝试向 speak() 添加一个 NSString 参数,但因 NSInvalidArgumentException 而失败。我这样称呼:proxy_obj.speak(NSString.stringWithString_("Notification"))以上是关于Cocoa/PyObjC 分布式对象缺少一些东西的主要内容,如果未能解决你的问题,请参考以下文章