我最近一直在学习 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情况下释放它不是更有意义吗?
我被这段代码弄糊涂了,希望有人能为我解释一下。感谢您提供任何信息,
鲁迪·奇里布拉西