我正在使用CocoaAsyncSocket库来创建TCP套接字连接。我遇到的问题是在调用了几个库方法之后,我收到了一个错误。
的appDelegate:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
socket = [[AsyncSocket alloc] initWithDelegate:self];
NSError *error = nil;
if (![socket connectToHost:@"199.5.83.63" onPort:11005 error:&error])
{
NSLog(@"Error connecting: %@", error);
}
[socket readDataWithTimeout:10 tag:1];
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
self.viewController = [[[tekMatrixViewController alloc] initWithNibName:@"tekMatrixViewController" bundle:nil] autorelease];
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}
以下是来自CocoaAsyncSocket Library的方法:
- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
NSData *strData = [data subdataWithRange:NSMakeRange(0, [data length])];
NSString *msg = [[NSString alloc] initWithData:strData encoding:NSUTF8StringEncoding];
NSLog(@"RX length: %d", [data length]);
if(msg)
{
NSLog(@"RX:%@",msg);
}
else
{
NSLog(@"Fail");
}
}
- (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err
{
NSLog(@"error - disconnecting");
//start reconnecting procedure here...
}
- (void)onSocketDidDisconnect:(AsyncSocket *)sock
{
NSLog(@"disconnected");
}
- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port
{
NSLog(@"connected");
}
当我在模拟器中运行我的应用程序时,这就是我的输出日志吐出的内容:
2012-06-08 13:17:30.808 tekMatrix[2793:f803] connected
2012-06-08 13:17:30.815 tekMatrix[2793:f803] RX length: 8
2012-06-08 13:17:30.816 tekMatrix[2793:f803] Fail
之后,我在此方法的AsyncSocket.m文件(库的一部分)中出错:
- (void)scheduleDequeueRead
{
if((theFlags & kDequeueReadScheduled) == 0)
{
theFlags |= kDequeueReadScheduled;
[self performSelector:@selector(maybeDequeueRead) withObject:nil afterDelay:0 inModes:theRunLoopModes];
}
}
具体来说,错误是在线:
[self performSelector:@selector(maybeDequeueRead) withObject:nil afterDelay:0 inModes:theRunLoopModes];
例外是:线程1:BAD_EXC_ACCESS(代码1 = 0,地址= 0xd0688b8a)
之后,应用程序在模拟器中完全冻结。如果有人能够提供一些有关导致应用程序冻结的原因,我会非常感激。
这是我正在使用的库:CocoaAsyncSocket
编辑:
启用Zombie Objects并在模拟器中运行应用程序后,这会在输出中吐出:
2012-06-08 14:53:15.416 tekMatrix[3217:f803] *** -[__NSArrayI count]: message sent to deallocated instance 0x6d10a70
我将不得不对此进行一些挖掘并弄清楚发生了什么。
编辑2:
在使用乐器进行一些挖掘之后,我发现了以下内容:
An Objective-C message was sent to a deallocated object (zombie) at address: 0x6b8bb10.
编辑3:
现在错误显示为:
线程1:EXC_BREAKPOINT(代码= EXC_I386_BPT,子代码= 0x0)
以下是乐器的截图。不过,我并没有真正关注如何解释这一点。看起来我正在向已经解除分配的对象发送消息。这是真的?如果是这样,我该如何找出这种情况呢?
如果图片很难看到,请点击以下链接:Instruments Screenshot
答案 0 :(得分:2)
您正在尝试访问不再存在的对象。可能你是在保留/过度释放它。
查看此答案,找到找到此类对象的工具:How do I set up NSZombieEnabled in Xcode 4?
答案 1 :(得分:1)
我知道事后的方式,但我遇到了同样的问题。解决方案是将ARC标志添加到AsyncSocket.m,-fobjc-arc
:)