Se ho un metodo Objective-C che accetta un parametro oggetto e detto metodo utilizza un blocco per eseguire internamente il proprio lavoro, esiste un modo per modificare tale oggetto all'interno del blocco?Come posso modificare i parametri di un metodo ObjC all'interno di un blocco?
È a mia conoscenza che blocchi le variabili di acquisizione dall'ambito genitore facendo riferimento a esse all'interno del blocco e che vengano copiate per impostazione predefinita. E se voglio essere in grado di modificare piuttosto che lavorare con una copia di un oggetto circostante, posso prefisso la sua dichiarazione con __block
, ma non riesco a farlo con i parametri del metodo poiché non l'ho dichiarato io stesso, giusto?
Ad esempio:
- (void)doWorkWithString:(NSString *)someString
{
[NSFoo doAwesomeClassMethodWithBlock:^{
// How can I modify someString here directly?
// By just changing someString, I'm changing the captured copy
}];
}
Sono troppo pigro per cercare i documenti, ma non credo che le variabili acquisite in un blocco vengano copiate; sarebbe molto sorprendente dal momento che gli oggetti potrebbero non implementare la copia. Se __block non è specificato, gli oggetti verranno comunque mantenuti dal blocco. All'interno del blocco, i puntatori di oggetti non sono diversi da qualsiasi altra parte, quindi per rispondere alla tua domanda puoi modificarli come preferisci. Quello che non puoi fare è scrivere su una variabile che è stata catturata * IF * __block non è stato fornito. Le variabili contrassegnate con __block non vengono mantenute dal blocco, quindi fai attenzione. Speriamo che abbia un senso. –
@darren: le variabili di blocco non -__ in un blocco * sono * copiate. Ma il valore di una variabile non è mai un oggetto. È possibile avere solo un * puntatore dell'oggetto *. Quindi, sì, quando un blocco acquisisce un puntatore a oggetti, copia il puntatore. Questo non ha assolutamente nulla a che fare con la copia di oggetti. – newacct
Intendevo il parametro "puntatore dell'oggetto" quando ho detto "parametro oggetto". per esempio. Passando un'istanza NSString *. –