我最近一直在学习Apple SDK(适用于iPhone等)并遇到了一些我无法理解的东西.在http://developer.apple.com/documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html的 "使用NSURLConnection"文档中
我发现了一个奇怪的解释和示例代码.首先,它说:
收到initWithRequest:delegate:消息后立即开始下载.它可以在委托收到connectionDidFinishLoading:或connection:didFailWithError:message之前随时通过向连接发送取消消息来取消.
接下来,它显示以下代码:
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; if (theConnection) { // Create the NSMutableData that will hold // the received data // receivedData is declared as a method instance elsewhere receivedData=[[NSMutableData data] retain]; } else { // inform the user that the download could not be made }
因此,在我看来,只要初始化连接,下载必须立即在不同的线程中启动.这很清楚,因为代码是非阻塞的,并将消息发送回委托,在本例中为self.然而,在启动另一个线程之后,receiveData的(自动释放样式)分配发生.这不是一种不安全的竞争条件吗?如果服务器响应非常快(例如,通过环回设备),或者在运行不顺畅的线程时,这是否会导致崩溃,内存泄漏或数据丢失?在初始化连接之前分配receivedData是否更有意义,然后在上面的else情况下释放它?
我对这段代码感到很困惑,希望有人可以为我解释一下.谢谢你的任何信息,
Rudi Cilibrasi
没有竞争条件.下载是在后台的单独线程上启动的,但是始终在开始下载的线程上调用发送给代理以通知您下载进度的消息.
在创建连接之前,您当然可以分配NSData,如果您更清楚的话.你甚至可以在连接中分配它:didReceiveData:方法,如果你想确保NSData没有被分配,除非有数据要存储.
我认为这个例子是以尽可能短的方式编写的,以免混淆演示文稿和许多不相关的代码.
从NSURLConnection的文档:
NSURLConnection的委托方法允许对象接收有关URL请求的异步加载的信息回调.其他委托方法提供了允许委托自定义执行异步URL加载的过程的工具.
请注意,将在启动相关NSURLConnection对象的异步加载操作的线程上调用这些委托方法.