Objective-C 关于线程和流的问题?

标签 objective-c ios multithreading stream

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

- (void) stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode

委托(delegate)被赋予 AppDelegate 的句柄,并且在 StreamDelegate 的每个其他部分中,AppDelegate 都存在。但是,在 stream:handleEvent: 中,当我尝试将结果传递回 AppDelegate 以进行额外处理时,我收到 EXC_BAD_ACCESS 错误。

我认为这可能是线程问题的唯一原因是关于 stream:handleEvent: 的文档指出:

The delegate receives this message only if theStream is scheduled on a run loop. The message is sent on the stream object’s thread. The delegate should examine streamEvent to determine the appropriate action it should take.

“流对象的线程”是指我的 StreamDelegate 吗?或者是对流的引用被传递给方法?我假设是后者,但想确保我没有弄错。

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

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

在四处寻找之后,我尝试了一些我曾考虑过的东西,然后又放弃了。我基本上创建了一个虚拟类,它被实例化并从 stream:handleEvent: 中调用。我调用执行此工作的方法:

[man performSelectorOnMainThread:@selector(saveEvent:) withObject:jsonDict waitUntilDone:YES];

在 saveEvent: 内部,我回调 AppDelegate 并且(几乎!)从那时起一切正常。

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

真正搞砸的部分是我根本无法获得任何崩溃的堆栈跟踪。我试过使用 LLVM 3.0 和 LLVM GCC 4.2,以及相应的调试器,但没有。我正在使用 Xcode 4.2。我在 4.1 中没有这个问题。

感谢@bbum 的智慧之言。非常感激。一旦我完全解决了这个问题,我将发布另一个更新。

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

由于上述错误,我这几天一直在用头撞墙,然后重写了代码。我又快要让一切正常工作了,但线程似乎仍然在困扰着我。

我收到以下错误:

warning: Unable to restore previously selected frame.

我正在做的是接收 NSInputStream 上的数据,并将其写出,然后尝试刷新 View 以指示更新。在调用之后的某个时间点,我应该看到对 viewWillAppear:(BOOL)animated 的调用,但是上面的警告首先出现并且应用程序锁定。

我已经在上面进行了大量的谷歌搜索,通常错误是在存在某种无限循环、堆栈溢出或内存不足的情况下出现的。我看不到发生这种类型的任何事情。我仍然认为我遇到了一个问题,我的线程交叉了,堆栈变得困惑了。我就是想不通为什么。

上面调用的 saveEvent: 选择器完成它的工作,然后修改 View 中的属性以指示它是脏的。此属性被触及。当我休息一下时,我看到它发生了。但是 viewWillAppear: 永远不会被调用。

这令人非常沮丧。这看起来是一件很简单的事情,但这是多么一团糟。

最佳答案

Does "the stream object's thread" refer to my StreamDelegate? Or is that a reference to stream being handed into the method? I'm assuming the later, but want to make sure I'm not mistaken.

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

If it is a different thread than what my AppDelegate sits on, then is that what is causing my problems? If so, then how do I handle it?

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

没有更多信息,无法多说。由于应用程序崩溃,您至少应该发布回溯。

关于Objective-C 关于线程和流的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7759688/

相关文章:

java - 当我们在消费者和生产者缓冲区中使用信号量时

html - iPad 上的 iOS UIWebView 窗口宽度和高度

ios - 如何获取对象的值

c - C 多线程消费者-生产者程序中的段错误

iphone - 将 UIActionSheet 选项连接到操作的正确方法

javascript - 在 Mobile Safari 中保持 WebSocket 事件

ruby-on-rails - Rails 最佳实践 : background process/thread?

Ios:如何避免捕获过程中视频方向发生变化?

ios - 境界限制查询结果

objective-c - Segue 未出现在图像选择器之后