20

Assumere il seguente codice sotto ARC,Sotto ARC, i blocchi vengono copiati automaticamente quando assegnati ad un ivar direttamente?

typedef void (^MyResponseHandler) (NSError *error); 
@interface MyClass : NSObject 
{ 
    MyResponseHandler _ivarResponseHandler; 
} 

- (void)myMethod:(MyResponseHandler)responseHandler 
{ 
    _ivarResponseHandler = responseHandler; 
    ... 
} 

Domanda: è il blocco copiato automaticamente al mucchio quando viene assegnato al ivar?

My previous question implica che viene copiato quando assegnato tramite un @property. Ma oggi ho usato il codice sopra riportato e ho ricevuto un EXC_BAD_ACCESS che è stato corretto passando a

_ivarResponseHandler = [responseHandler copy].

risposta

4

Il tuo problema e la soluzione indicano che la mia risposta alla tua altra domanda era probabilmente sbagliata. Ho basato sulla ultimo paragrafo della sezione 7.5 di the clang Objective-C Automatic Reference Counting documentation:

Con l'eccezione di trattiene fatto come parte di inizializzazione di una variabile parametro __strong o la lettura di una variabile __weak, ogni volta che questa semantica richiedono mantenendo un valore di Stop dopo tipo puntatore, ha l'effetto di un Block_copy. L'ottimizzatore può rimuovere tali copie quando vede che il risultato è utilizzato solo come argomento per una chiamata.

presi “questa semantica” per significare l'intero documento, ma se “questa semantica” ad riferisce solo alla sezione 7.5, quindi la inserisce ARC solo Block_copy per un blocco che viene catturata da un blocco.

+0

Sono d'accordo non è chiaro cosa "questa semantica" si riferisca a – sbooth

+0

+1, il testo della sezione è incredibilmente confuso. – orip

+3

Ho parlato con l'ingegnere Apple che ha scritto questa sezione. Ha detto che "questa semantica" si riferisce all'intero documento. Quindi un 'Block_copy' dovrebbe essere inserito automaticamente. Sembra che forse questo era un bug all'inizio con blocchi che sono stati successivamente risolti. – bearMountain

10

Edit: La mia risposta precedente era probabilmente sbagliato.

Alcuni estratti selezionati dal ARC docs dicono:

3. puntatori all'oggetto retainable

Un puntatore oggetto a conservazione (o puntatore a conservazione) è un valore di tipo puntatore oggetto a conservazione (tipo a conservazione). Ci sono tre tipi di tipi di puntatore dell'oggetto retainable:

  • puntatori a blocchi (formato applicando il cursore (^) dichiaratore sigillo per un tipo di funzione)

4,2. Semantica

L'assegnazione avviene quando si valuta un operatore di assegnazione. La semantica varia in base alla qualifica:

  • Per gli oggetti forti, il nuovo pointee viene prima trattenuto; in secondo luogo, il lvalue è caricato con semantica primitiva; in terzo luogo, il nuovo pointee è immagazzinato nel lvalue con semantica primitiva; e infine, il vecchio pointee viene rilasciato. Questo non viene eseguito atomicamente; la sincronizzazione esterna deve essere utilizzata per rendere questo sicuro di fronte a carichi e negozi concorrenti.

4.4.1.Oggetti

Se un oggetto viene dichiarato con il tipo di proprietario dell'oggetto conservabile, ma senza un qualificatore di proprietà esplicito, il suo tipo viene adattato implicitamente per avere una qualifica __strong.

7.5. Blocchi

Ad eccezione dei ritardi eseguiti come parte dell'inizializzazione di una variabile di parametro __strong o della lettura di una variabile __weak, ogni volta che questa semantica richiede di mantenere un valore di tipo puntatore a blocchi, ha l'effetto di un Block_copy. L'ottimizzatore può rimuovere tali copie quando vede che il risultato è utilizzato solo come argomento per una chiamata.

Quindi penso che la risposta sia forse, a seconda dell'ottimizzatore.

+0

Sai che ti sto chiedendo in riferimento a un ambiente conteggio automatico di riferimento? Sembra che il tuo esempio di foo/bar non sia un problema in ARC ...? – bearMountain

+0

Sì, mi dispiace. La tua risposta, o la documentazione Apple fornita, non dice nulla sul fatto che ARC trasferisca automaticamente un blocco all'heap quando viene assegnato a una variabile di istanza. Sembra che la risposta a questa domanda debba provenire dalla documentazione clang Objective-C Reference Reference Counting (http://clang.llvm.org/docs/AutomaticReferenceCounting.html#misc.blocks). – bearMountain

+0

@bearMountain Hai ragione, ho provato a correggere la mia risposta. – sbooth

Problemi correlati