2011-09-01 4 views
1

cfsocket의 콜백에 uilabel 텍스트를 설정하고 싶지만 작동하지 않습니다. 오류 : "선언되지 않은 식별자 'label'사용" 하지만이 setText는 다른 함수에서 작동합니다. 왜이 함수에 포함되지 않습니까?콜백 함수에 uilabel 설정

콜백 기능 :

- (IBAction)deconn:(id)sender 
{ 
    if (conn_ok && socket && sock_addr) { 
     CFSocketInvalidate(socket); 
     [label setText:@"disconnected"]; 
     conn_ok = false; 
     [sock_addr release]; 
    } 

} 

좋아, 내 기능에서이 작업을 수행해야 :

socketViewController *toto = (id)info; 
[toto.label setText:@"received msg"]; 

하지만 '돈의 setText 작업

static void receiveData(CFSocketRef s, CFSocketCallBackType type, CFDataRef address, const void *data, void *info) 
{ 
    UInt8 *buff; 

    NSLog(@"%ld",CFDataGetLength(data)); 

    CFDataGetBytes(data, CFRangeMake(0, CFDataGetLength(data)), buff); 

    NSLog(@"%s",buff); 

    [label setText:@"toto"]; 
} 

기능 T는 일을, 내가 en을 받고 EXEC_BAD_ACCESS, 나는 th 로그인입니다 :

sharedlibrary apply-load-rules all 
warning: Unable to restore previously selected frame. 
(gdb) 

나는 그것이 메모리 액세스 문제가 생각 나는 기능 아무것도하지만, 변화의 끝에서 toto = nil;를 추가 할 수 있습니다.

답변

0

receiveData은 메소드가 아니라 함수입니다. 개체의 비공개 ivar에 액세스하려고합니다. 접근 자 (self.label)를 사용했다면 더 명확했을 것입니다. 접근자를 사용하십시오.

info 포인터를 사용하여 레이블에 액세스 할 수 있도록 self을 콜백에 전달할 수 있습니다.

CFSocketContext context = { 0, self, NULL, NULL, NULL }; 

는 이제 CFSocketCreate... 전화, 당신은 컨텍스트 매개 변수 &context를 전달합니다 :

info 포인터를 구성하려면, 당신은 당신이 소켓을 만들 때 컨텍스트를 전달해야합니다.

CFSocket을 구현하는 대신 일반적으로 cocoaasyncsocket을 권장합니다. 훨씬 쉬운 인터페이스를 제공합니다.

+0

@ Xantra : 'self'는이 개체를 나타내는 키워드입니다. 식별자로 사용할 수 없습니다. – sashang

0

receiveData은 정적 함수이므로 개체 C의 개체 변수 (ivars)에 액세스 할 수 없습니다.

관련 문제