我想在一个cfsocket的回调上设置一个uilabel的文本,但它不起作用。错误是:“使用未声明的标识符'标签'” 但是这个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"];
}
setText工作的函数:
- (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"];
但它不起作用,我收到了EXEC_BAD_ACCESS,我在日志中有这个:
sharedlibrary apply-load-rules all
warning: Unable to restore previously selected frame.
(gdb)
我认为这是一个内存访问问题,我在函数末尾添加toto = nil;
但没有任何变化。
答案 0 :(得分:0)
receiveData
是一个函数,而不是一个方法。您正在尝试访问对象的私有ivar。如果你使用了访问器(self.label
),那就更清楚了。使用访问者。
您可以使用info
指针将self
传递给回调,以便您可以访问该标签。
要配置info
指针,需要在创建套接字时传递上下文:
CFSocketContext context = { 0, self, NULL, NULL, NULL };
现在,在您的CFSocketCreate...
电话中,您将传递&context
上下文参数。
我建议cocoaasyncsocket而不是实现您自己的CFSocket
。它提供了一个更简单的界面。
答案 1 :(得分:0)
receiveData
是一个静态函数,因此它不能访问任何对象的成员变量(在目标C中调用它们的ivars)。