我可以从C函数调用Objective-C方法吗?

时间:2011-03-13 06:51:07

标签: objective-c c cocoa cocoa-touch

我是Objective-C的新手,所以我想要做的可能是不可能的。我正在将一个大的C函数重构为多个C函数和Obj-C方法。

这可能吗?

以下内容不会构建和抱怨

  

'自我'未宣布。

  void serverCB(CFReadStreamRef stream, CFStreamEventType event, void *myPtr)
{
    switch(event) {
        case kCFStreamEventHasBytesAvailable:
            [self readStreamData:stream];
            break;
        case kCFStreamEventErrorOccurred:
            NSLog(@"A Read Stream Error Has Occurred!");
            break;
        case kCFStreamEventEndEncountered:
            NSLog(@"A Read Stream Event End!");
            break;
        default:
            break;
    }
}

-(void) readStreamData: (CFReadStreamRef)stream
{   
        NSData *data = [[NSMutableData alloc] init]; //TODO: I have to flush this at some point..?
        uint8_t buffer[1024];
        unsigned int len = 0;       
        len =  [(NSInputStream *)stream read:buffer maxLength:1024];        
        if(len > 0)
        {
            [data appendBytes:&buffer length:len];
        }
        NSString *serverText = [[NSString alloc]    initWithData: data encoding:NSASCIIStringEncoding];
           [data release]; // I got my string so I think I can delete this
           [self processServerMessages:serverText];

    }
}

在列出的第一个函数中,'serverCB'我试图将'readStreamData'消息发送到当前对象。那么我只能从c函数中调用c函数吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

可以从C函数调用Objective-C方法。但是,正如错误告诉您的那样,变量self未定义。您需要将self作为参数传递给serverCB,例如

void serverCB(CFReadStreamRef stream, CFStreamEventType event, void* myPtr, id self) {
   ...
   [self readStreamData:stream];
   ...
}

...

serverCB(stream, event, NULL, self);

答案 1 :(得分:1)

您还可以创建类功能。

@interface MyClass : NSObject
{}
+ (void) myDoSometing;
@end

void myDo(int foo)
{
  [MyClass DoSomething];
}