2010-05-24 60 views
1

我不喜欢在objc中开始编程,我在徘徊如何在现有的objc应用程序中使用python代码。我发现这个网站和其他一些线程,但他们根本没有帮助我。我想要做的是采用apple's developer website中的SpotlightAPI,并使用结果用python代码处理它们。到目前为止,我已完成以下工作:
1.从苹果下载SpotlightAPI
2.基于PyObjc的cocoa-python应用程序模板创建一个新项目
3.将SpotlightAPI中的控制器文件添加到PyObjC中
4 。配置绑定的方式与SpotlightAPI中的相同方式
5.执行程序并全部成功工作
6.创建一个从NSObject继承的新python类文件(称为python.py)
7. python文件具有以下代码:
在现有的应用程序中的python和objc桥梁

from Foundation import * 
import objc 

NSObject = objc.lookUpClass(u"NSObject") 
print "PYTHON VERSION BEING USED:" 

class Python(NSObject): 
    def sendit_(self, something): 
     print something 
     return "asdf" 


8.我插入这个代码在Controller.m或者文件的开头:

@class Python; 

@interface NSObject (MethodsThatReallyDoExist) 
-(NSString *) sendit: (id) aString; 

@end 

@implementation Controller 
- (id)init 
{ 
    self = [super init]; 
    Class pythonClass = NSClassFromString(@"Python"); 
    myPython = [pythonClass new]; 
    NSLog(@"Created PythonClass: %@", myPython); 
    NSString * oneString = [myPython sendit:@"asdf"]; 
    NSLog(@"%@", oneString); 
    return self; 
} 


9.在或者Controller.h变量声明添加id *myPython;文件
10.在实施的方法sendit Controller.m或者文件是这样的:

- (NSString *) sendit:(id) aString 
{ 

    return [myPython sendit:aString]; 
} 


它编译和运行成功,但我从初始化函数获取控制台消息是:Created PythonClass: (null)以及下一个日志的字符串返回值为(null)
任何人都知道我在做什么错?

回答

0

在列出的代码中存在一些可疑的事情。首先,你应该有id myPython而不是id *myPython,因为id已经是一个指针了。其次,你在NSString类中声明一个方法,但是在一个子类中实现它。通常,您想要在同一个类的类别实现中实现该方法(本例中为NSObject)。第三,它有点循环,让sendit作为NSObject的一个方法,当它实现时,在myPython上调用sendit,这也是一个NSObject。我很惊讶它编译并且不会崩溃。尝试清理这些问题并查看你的位置。希望这可以帮助!