【发布时间】:2009-05-07 01:38:56
【问题描述】:
我最近一直在学习 Apple SDK(适用于 iPhone 等),但遇到了一些我无法理解的东西。在来自http://developer.apple.com/documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html的“使用 NSURLConnection”的文档中
我发现了一段奇怪的解释和示例代码。首先,它说:
在收到 initWithRequest:delegate: 消息后立即开始下载。可以在代理收到 connectionDidFinishLoading: 或 connection:didFailWithError: 消息之前的任何时间通过向连接发送取消消息来取消它。
接下来,它显示了以下代码:
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 如果(连接){ // 创建将保存的 NSMutableData //接收到的数据 // receivedData 在别处被声明为方法实例 receivedData=[[NSMutableData 数据] 保留]; } 别的 { // 通知用户无法下载 }因此,在我看来,一旦连接初始化,下载必须立即在不同的线程中开始。这很清楚,因为代码是非阻塞的,并将消息发送回委托,在本例中为 self。然而,receivedData 的(自动释放样式)分配发生在 另一个线程启动之后。这不是不安全的比赛条件吗?如果服务器响应非常快(例如通过环回设备)或线程调度不顺利,这不会导致崩溃、内存泄漏或数据丢失吗?在初始化theConnection之前分配receivedData,然后在上面的else情况下释放它不是更有意义吗?
我被这段代码弄糊涂了,希望有人能帮我解释一下。 感谢您提供任何信息,
鲁迪·西里布拉西
【问题讨论】:
标签: iphone race-condition