2011-11-02 4 views
17
  1. Se io dichiaro una proprietà forte, in questo modo:È necessario self.iVar per le proprietà forti con ARC?

    @property (strong, nonatomic) UIView *iVar; 
    

    Quando sto impostazione, cosa importa se faccio iVar = ... o self.iVar = ...? Sembra che con ARC, fanno la stessa cosa.

  2. Se dichiaro solo la variabile di istanza (non il @property), per esempio, BOOL selected, significa che è dedotto di essere __unsafe_unretained (dal momento che non c'è alcuna proprietà specificando di essere forte), o devo specificare esplicitamente che?

sembra che io possa aver risposto alle mie domande proprio al di sopra nel rispondere ARC: How to release static variable?, ma io sono ancora un po 'confuso sulle domande di cui sopra.

risposta

20

Dal punto di vista della gestione della memoria, utilizzando ivar = ... o self.property = ... (nota: non c'è alcuna cosa come self.ivar) sono gli stessi. Tuttavia, l'utilizzo di ivar = ... non richiama il setter mentre lo fa self.property = .... Questo ha 3 ramificazioni importanti, in nessun ordine particolare:

  1. Se la proprietà non è contrassegnato nonatomic, quindi accedere alla Ivar sottostante non avrà la serratura e sarai rompendo le implicazioni atomicità.
  2. Se la proprietà viene sovrascritta, dall'utente o da una sottoclasse, il setter sottoposto a override non verrà richiamato.
  3. Le notifiche KVO non saranno inviate.

Come per la sola dichiarazione di ivar, ha la stessa semantica di gestione della memoria che dichiara una variabile locale. Questo è documentato nel documento section 4.4 of the Objective-C Automatic Reference Counting, ma fondamentalmente, se si tratta di un oggetto, sarà dedotto per essere __strong.

+0

@kaka: No. Triassiale controesempio: l'assegnazione di una struttura più ampia di una singola parola non è quasi certamente atomica indipendentemente dall'ARC/MRR. –