J'ai récemment appris le SDK Apple (pour iPhone, etc) et suis tombé sur quelque chose que je ne peux pas comprendre. Dans les documents pour "Using NSURLConnection" deErreur ou confusion dans la documentation Apple SDK sur NSURLConnection?
J'ai trouvé un morceau d'explication étrange et un exemple de code. D'abord, il est dit:
Le téléchargement commence immédiatement après la réception du message initWithRequest: delegate:. Il peut être annulé à tout moment avant que le délégué ne reçoive un connectionDidFinishLoading: ou une connexion: didFailWithError: message en envoyant un message d'annulation à la connexion.
Ensuite, il montre le morceau de code suivant:
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 }
Alors, il me semble que le téléchargement doit commencer immédiatement dans un autre thread dès theConnection est initialisé. Cela est clair car le code est non bloquant et renvoie des messages au délégué, dans ce cas, self. Pourtant, l'allocation (autorelease style) de receivedData se produit après l'autre thread est démarré. N'est-ce pas une condition de course dangereuse? Cela ne peut-il pas entraîner un plantage, une fuite de mémoire ou une perte de données dans le cas d'une réponse très rapide du serveur (par exemple un périphérique de bouclage supérieur) ou dans le cas d'une planification de threads malencontreuse? Cela n'aurait-il pas plus de sens d'allouer receiveData avant l'initialisation de Connection, et ensuite de le relâcher dans le cas else ci-dessus?
Je suis si confuse par ce morceau de code, j'espère que quelqu'un pourra me donner un peu de lumière. Merci pour toute information,
Rudi Cilibrasi
Cela a du sens. Pouvez-vous donner une URL qui supporte l'affirmation que tous les messages de délégation sont envoyés par le fil principal s'il vous plaît pour mon étude? Merci pour l'aide et l'info. –
Il est également intéressant de noter que les messages de délégation de NSURLConnection sont rassemblés via la boucle d'exécution et ne peuvent donc se produire qu'une fois le contrôle renvoyé. – rpetrich
Merci beaucoup pour l'aide Mark Bessey et rpetrich. C'est clair pour moi maintenant et je l'apprécie. –