/ / Differenza: crea istanze con metodi di classe o assegnando loro valori di ritorno - obiettivo-c, metodo di classe

Differenza: crea istanze con metodi di classe o assegnando loro valori di ritorno - obiettivo-c, metodo di classe

solo una piccola domanda con una risposta semplice e breve, spero ;-)

Qual è esattamente la differenza tra (cioè)

NSData *htmlData = [NSURLConnection sendSynchronousRequest:self.request returningResponse:&response error:nil];

e

NSData *htmlData = [NSData dataWithData:[NSURLConnection sendSynchronousRequest:self.request returningResponse:&response error:nil]]

O non c'è alcuna differenza? Se è importante, sì, io uso ARC.

Molte grazie!

risposte:

2 per risposta № 1

Non c'è una risposta semplice e breve :)

Nel primo, gestisci i dati restituiti dalla connessione URL.

Nel secondo, crei una copia di quei dati - che "copia" btw, potrebbe non essere effettivamente una copia profonda per una serie di motivi.

In che modo questo si comporta può davvero andare entrambi i modie molto è difficile rispondere perché:

  • a) dipende in gran parte da come il tuo programma usa quei dati e
  • b) ottimizzazioni interne e dettagli di implementazione delle API che stai utilizzando
  • c) copia o conserva la semantica dei tuoi oggetti

Personalmente, preferisco quest'ultimo quando ho bisogno di passare quei dati in giro. Il motivo è che dovresti dichiarare i tuoi ivar per i tipi che hanno varianti mutabili come copia (NSMutableData in questo caso), e generalmente dovresti lavorare concopie immutabili di questi oggetti ove possibile. Una volta che molte delle tue implementazioni gestiscono questi tipi con varianti mutabili per copia, allora puoi effettivamente ridurre copiando assicurandoti che gli oggetti con cui hai a che fare sono in effetti immutabili - gli oggetti immutabili possono evitare copie profonde e persino superficiali quando viene richiesta una copia.

Se tali dati non vengono passati da nessun'altra parte, è possibile evitare una potenziale copia nel caso in cui l'API restituisca un'istanza di NSMutableData (cioè puoi usare il primo in modo sicuro).