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
线程和流的Objective-C问题?_Objective C_Ios_Multithreading_Stream - Fatal编程技术网

线程和流的Objective-C问题?

线程和流的Objective-C问题?,objective-c,ios,multithreading,stream,Objective C,Ios,Multithreading,Stream,我不确定这是否是线程的问题,但我不知道还有什么可能导致我的问题。我有一个iOS应用程序,它有一个NSStreamDelegate调用 - (void) stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode 委托被赋予AppDelegate的句柄,并且在StreamDelegate的每个其他部分中,AppDelegate都存在。但是,在stream:handleEvent:中,当我尝试将结果传递回AppDelegate进行额

我不确定这是否是线程的问题,但我不知道还有什么可能导致我的问题。我有一个iOS应用程序,它有一个NSStreamDelegate调用

- (void) stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode
委托被赋予AppDelegate的句柄,并且在StreamDelegate的每个其他部分中,AppDelegate都存在。但是,在stream:handleEvent:中,当我尝试将结果传递回AppDelegate进行额外处理时,会出现EXC_BAD_访问错误

我认为这可能是线程问题的唯一原因是stream:handleEvent:states上的文档:

仅当流计划在运行循环中时,委托才会收到此消息。消息在流对象的线程上发送。学员应检查streamEvent以确定应采取的适当操作

“流对象的线程”是否指我的StreamDelegate?或者,这是对正在传递到方法中的流的引用?我假设晚一点,但我想确定我没有弄错

如果它与我的AppDelegate所在的线程不同,那么这就是导致我出现问题的原因吗?如果是,我该如何处理

编辑:根据@bbum,我正在更新以表明我做了什么

在闲逛之后,我尝试了一些我曾经考虑过的东西,然后就放弃了。本质上,我创建了一个从流handleEvent:实例化和调用的伪类。我调用执行以下操作的方法:

[man performSelectorOnMainThread:@selector(saveEvent:) withObject:jsonDict waitUntilDone:YES];
在saveEvent:内部,我调用AppDelegate,从那时起(几乎!)一切正常

我目前遇到一个问题,调试器抱怨试图写入一个不存在的文件。我还不知道它为什么这么做。该文件名看起来像是在“iPhone Simulator/5.0/Applications/”下为该应用程序创建的散列目录,但我还没有弄清楚错误发生的确切位置

真正糟糕的是,我根本无法获得任何崩溃的堆栈跟踪。我尝试过使用LLVM3.0和LLVMGCC4.2,以及相应的调试器,但什么都没有。我使用的是Xcode 4.2。我在4.1中没有这个问题

谢谢你的智慧之言,@bbum。非常感谢。我会发布另一个更新,一旦我得到这个完全散列出来

编辑(2011-10-18):[更新:没关系,我是个白痴。我正在将流读入字节数组,但没有声明显式大小。我遇到了某种缓冲区溢出。现在一切正常。]

由于上述错误,我已经连续几天把头撞在墙上,然后重写了代码。我又一次几乎要让所有的东西都运转起来了,但线程似乎仍然在咬我的屁股

我得到以下错误:

警告:无法还原以前选择的帧

我正在做的是接收NSInputStream上的数据,并将其写出,然后尝试刷新视图,以指示更新。在呼叫完成后的某个时刻,我应该会看到一个调用viewwills:(BOOL)动画,但上面的警告首先出现,应用程序锁定

我在谷歌上搜索了大量的内容,通常当出现某种无限循环、堆栈溢出或是内存崩溃时会出现错误。我看不到这种情况发生。我仍然认为我遇到了一个问题,我的思路交叉了,堆栈变得混乱了。我就是不明白为什么

上面调用的saveEvent:selector完成它的工作,然后修改视图中的属性以指示它是脏的。这个属性会被触动。我看到它发生时,我把它打破。但视图将显示:从未被调用

这令人难以置信地沮丧。这似乎是件很简单的事情,但这一切都是一团糟

“流对象的线程”是否指我的StreamDelegate?或者是 这是对正在被传递到方法中的流的引用吗?我想 晚一点,但我想确定我没有弄错

每个线程只能有一个runloop。委托将在流调度的运行循环的任何线程上被调用

如果它与我的AppDelegate所在的线程不同,那么 那是什么导致了我的问题?如果是,我该如何处理

可能是,;如果您的AppDelegate不是线程安全的,并且流被安排在非主线程上,那么很可能就是问题所在

没有更多的信息,就不可能说得更多。既然应用程序正在崩溃,你至少应该发布回溯

“流对象的线程”是否指我的StreamDelegate?或者是 这是对正在被传递到方法中的流的引用吗?我想 晚一点,但我想确定我没有弄错

每个线程只能有一个runloop。委托将在流调度的运行循环的任何线程上被调用

如果它与我的AppDelegate所在的线程不同,那么 那是什么导致了我的问题?如果是,我该如何处理

可能是,;如果您的AppDelegate不是线程安全的,并且流被安排在非主线程上,那么很可能就是问题所在


没有更多的信息,就不可能说得更多。由于应用程序正在崩溃,您至少应该发布回溯信息。

您解决了这个问题吗?我正在做一些非常类似的事情,并让它工作,虽然我遇到了一个问题,随机不接收所有字符,应该出现在流

如果有帮助的话,我可以发布在我的情况下有效的代码

实际上,我的代码是启动一个后台线程,然后委托使用该线程监视流

-(void)backgroundThreadFunction:(NSObject*)obj
{
    [self setBackgroundThread:[NSThread currentThread]];
    [streamDelegate OpenSession:accessoryInfo];

    while(_continueRunning) {
        NSAutoReleasePool *_pool = [[NSAutoReleasePool alloc] init];
        [[NSRunLoop currentRunLoop] runUntilDate:[NSDate date]];
        [_pool release];
    }

    [self setBackgroundThread:nil];
}
流委托OpenSession指定在t中的当前线程上运行
[[currentSession inputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

[[currenSession outputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[[NSNotificationCenter defaultCenter] postNotificationName:@"DataReceived" object:_receivedData];