2011-03-13 111 views
1

我是Objective-C的新手,所以我想做的事情可能是不可能的。我正在將一個大的C函數重構爲多個C函數和Obj-C方法。我可以從C函數調用Objective-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

可以從C函數調用Objective-C方法。但正如錯誤告訴你的,變量self沒有定義。您需要將self作爲參數傳遞給serverCB,例如,

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

... 

serverCB(stream, event, NULL, self); 
+0

如果是有意義的這樣做,特別是如果是有意義的命名參數「自我」,然後有一個很好的機會,有問題的功能確實應該什麼類的「自我」的方法屬於至。 – Caleb 2011-03-13 18:27:12

+0

@Caleb ..好點。我應該讓這個功能屬於這個類,而不是綁定到一個特定的實例。 – Nick 2011-03-13 21:49:00

1

你也可以做類功能。

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

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

Upvoted。我認爲使這個類功能是適當的。謝謝。 – Nick 2011-03-13 21:49:26

相關問題