Я недавно изучал Apple SDK (для iPhone и т. Д.) И наткнулся на то, чего я не могу понять. В документах для "Использование NSURLConnection" от http://developer.apple.com/documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html
Я нашел странный фрагмент объяснения и пример кода. Сначала говорится:
Загрузка начинается сразу после получения сообщения initWithRequest: Delegate:. Его можно отменить в любое время до того, как делегат получит сообщение connectionDidFinishLoading: или connection: didFailWithError: отправив соединению сообщение об отмене.
Далее показывается следующий фрагмент кода:
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
}
Итак, мне кажется, что загрузка должна начаться сразу в другом потоке, как только инициализируется соединение. Это ясно, потому что код не блокирует и отправляет сообщения делегату, в данном случае, самостоятельно. Тем не менее, выделение (в стиле авто-релиза) ReceiveData происходит после запускается другой поток. Разве это не опасное состояние гонки? Может ли это привести к сбою, утечке памяти или потере данных в случае очень быстрого отклика сервера (например, через устройство с обратной связью) или в случае неудачного планирования потоков? Разве не имеет смысла выделять полученныйData до инициализации theConnection, а затем просто освободить его в другом случае выше?
Я так запутался в этом куске кода, надеюсь, кто-нибудь сможет пролить свет на это для меня.
Спасибо за любую информацию,
Руди Чилибрази