在 PyObjC 中使用 python 函数回调?
我正在尝试使用 Python 中的 Objective-C 类来执行此操作,但 Objective-C 无法调用调用 python 函数的方法。
这是 Objective-C 代码的框架代码:
//
// scalelib.h
// Scalelib Cocoa Framework
//
// Created by Matthew Mitchell on 04/07/2010.
// Copyright 2010 __MyCompanyName__. All rights reserved.
//
#import <Cocoa/Cocoa.h>
@interface Game : NSObject {
id current_pyfunc;
}
-(void) addPyFunc: (id) pyfunc;
-(void) callPyFunc;
@end
//
// scalelib.m
// Scalelib Cocoa Framework
//
// Created by Matthew Mitchell on 04/07/2010.
// Copyright 2010 __MyCompanyName__. All rights reserved.
//
#import "Game.h"
@implementation Game
-(void) addPyFunc: (id) pyfunc{
current_pyfunc = pyfunc;
}
-(void) callPyFunc{
[current_pyfunc call]; //Segmentation fault. Method doesn't exist for some reason.
}
@end
这是加载框架并测试回调使用失败的 python 脚本。
#!/usr/bin/env python2.3
from objc import *
import os,sys
loadBundle("Scalelib Cocoa Framework",globals(),os.path.dirname(sys.argv[0]) + "/Scalelib Cocoa Framework/build/Release/Scalelib Cocoa Framework.framework/")
class PythonCallback(NSObject):
def setCallback_withArgs_(self, python_function,args): #Python initialisation of class, add the callback function and arguments
self.python_function = python_function
self.args = args
return self
def call(self): #Used by Objective-C to call python function
self.python_function(*self.args)
def create_callback(function,args):
return PythonCallback.alloc().init().setCallback_withArgs_(function,args)
def square(num):
print num**2
instance = Game.alloc().init()
callback = create_callback(square,[3])
callback.call()
instance.addPyFunc_(create_callback(square,[5]))
instance.callPyFunc()
我得到的输出:
9 分段错误
分段错误是因为Python中的调用方法显然不存在。那么如何让它存在于 Objective-C 中呢?
即使代码确实有效,它也是无用的,但我目前只是在测试一些东西。一旦回调工作正常,我就可以为 python 创建库了。
感谢您的帮助。
I'm trying to use an Objective-C class made in Python to do this but Objective-C can't call the method which calls the python function.
Here's the framework code which the Objective-C code:
//
// scalelib.h
// Scalelib Cocoa Framework
//
// Created by Matthew Mitchell on 04/07/2010.
// Copyright 2010 __MyCompanyName__. All rights reserved.
//
#import <Cocoa/Cocoa.h>
@interface Game : NSObject {
id current_pyfunc;
}
-(void) addPyFunc: (id) pyfunc;
-(void) callPyFunc;
@end
//
// scalelib.m
// Scalelib Cocoa Framework
//
// Created by Matthew Mitchell on 04/07/2010.
// Copyright 2010 __MyCompanyName__. All rights reserved.
//
#import "Game.h"
@implementation Game
-(void) addPyFunc: (id) pyfunc{
current_pyfunc = pyfunc;
}
-(void) callPyFunc{
[current_pyfunc call]; //Segmentation fault. Method doesn't exist for some reason.
}
@end
Here is the python script which loads the framework and tests the use of callbacks with failure.
#!/usr/bin/env python2.3
from objc import *
import os,sys
loadBundle("Scalelib Cocoa Framework",globals(),os.path.dirname(sys.argv[0]) + "/Scalelib Cocoa Framework/build/Release/Scalelib Cocoa Framework.framework/")
class PythonCallback(NSObject):
def setCallback_withArgs_(self, python_function,args): #Python initialisation of class, add the callback function and arguments
self.python_function = python_function
self.args = args
return self
def call(self): #Used by Objective-C to call python function
self.python_function(*self.args)
def create_callback(function,args):
return PythonCallback.alloc().init().setCallback_withArgs_(function,args)
def square(num):
print num**2
instance = Game.alloc().init()
callback = create_callback(square,[3])
callback.call()
instance.addPyFunc_(create_callback(square,[5]))
instance.callPyFunc()
I get the output:
9
Segmentation fault
The segmentation fault is because the call method made in python doesn't exist apparently. So how to I make it exist for Objective-C?
Even if the code did work it would be useless but I'm only testing things at the moment. Once I have the callbacks working, I'll be able to make my library for python.
Thank you for any help.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我的猜测是保留计数。
您不会保留传递给 addPyFunc_ 的 create_callback() 的结果,
因此,在调用它之前它可能会被垃圾收集掉。
My guess would be retain counts.
You don't retain the result of create_callback() that you pass into the addPyFunc_
As such, it probably gets garbage collected away before you call it.