Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 调用CocoaAsyncMethod scheduleDequeueRead时应用程序冻结_Iphone_Objective C_Ios_Cocoaasyncsocket - Fatal编程技术网

Iphone 调用CocoaAsyncMethod scheduleDequeueRead时应用程序冻结

Iphone 调用CocoaAsyncMethod scheduleDequeueRead时应用程序冻结,iphone,objective-c,ios,cocoaasyncsocket,Iphone,Objective C,Ios,Cocoaasyncsocket,我正在使用CocoaAsyncSocket库创建TCP套接字连接。我遇到的问题是,在调用了一些库方法之后,我得到了一个错误 appDelegate: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { socket = [[AsyncSocket alloc] initWithDelegate:self];

我正在使用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库中的方法:

- (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:错误的EXC访问(代码1=0,地址=0xd0688b8a)

之后,应用程序在模拟器中完全冻结。如果有人能提供一些关于为什么这会导致应用程序冻结的见解,我将不胜感激

这是我正在使用的库:

编辑:

启用僵尸对象并在模拟器中运行应用程序后,输出中将显示:

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_断点(代码=EXC_I386_BPT,子代码=0x0)

这里是一个来自仪器的屏幕截图。不过,我并没有真正理解如何解释这一点。看起来我正在向已解除分配的对象发送消息。这是真的吗?如果是这样的话,我该如何着手找出这种情况发生的地方

如果图像很难看到,这里有一个直接链接:


您正在尝试访问一个不再存在的对象。可能是您未充分保留/过度释放了它


有关查找此类对象的工具,请参见此答案:

您正在尝试访问一个不再存在的对象。可能是您未充分保留/过度释放了它


请参阅以下答案,以获得查找此类对象的工具:

我知道这是事实之后的事情,但我也遇到了同样的问题。解决方案是将ARC标志添加到AsyncSocket.m,-fobjc ARC


:)

我知道这是事后诸葛亮,但我也遇到了同样的问题。解决方案是将ARC标志添加到AsyncSocket.m,-fobjc ARC


:)

投了赞成票,因为答案至少让最初的发问者能够细化问题。@vikingosegundo我道歉。我还在学习SO的功能。投赞成票:)投反对票,因为答案至少让最初的提问者能够细化问题。@vikingosegundo我道歉。我还在学习SO的功能。向上投票:)您可以显示代码,在那里创建AsyncSocket对象吗?与属性一起,如果将其写入一个。AsyncObject位于didFinishLaunchingWithOptions方法的顶部。我在剔除注释掉的行时无意中漏掉了那行代码。我不知道这是否有帮助,但如果我删除了行“[socket readDataWithTimeout:10 tag:1]”,那么应用程序就不会冻结或生成错误。它只连接到主机,不读取任何数据。它看起来不像。我编写的大部分代码都是在教程和SO用户的帮助之间共同编写的。为什么我需要使用属性套接字?你知道,属性是什么吗?你能展示一下代码,在那里创建AsyncSocket对象吗?与属性一起,如果将其写入一个。AsyncObject位于didFinishLaunchingWithOptions方法的顶部。我在剔除注释掉的行时无意中漏掉了那行代码。我不知道这是否有帮助,但如果我删除了行“[socket readDataWithTimeout:10 tag:1]”,那么应用程序就不会冻结或生成错误。它只连接到主机,不读取任何数据。它看起来不像。我编写的大部分代码都是在教程和SO用户的帮助之间共同编写的。为什么我需要使用属性套接字?你知道,属性是什么吗?