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 分布式对象缺少一些东西的主要内容,如果未能解决你的问题,请参考以下文章

Webkit 浏览器的检查器缺少一些东西

缺少一些简单的东西(按钮 OnClick 导致空指针)

我已经为从我的表名中获取记录编写了这段代码是所有者...但是发生了一些错误...是不是缺少某些东西?

java培训都讲啥东西

集群和分布式的概念:

集群和分布式的区别: