Aggiungendo due centesimi per migliorare la precisione e lo stile. Nella maggior parte dei casi utilizzerai solo uno o un paio di membri di self
questo blocco, molto probabilmente solo per aggiornare un dispositivo di scorrimento. Il casting self
è eccessivo. Invece, è meglio essere espliciti e lanciare solo gli oggetti di cui hai veramente bisogno all'interno del blocco. Ad esempio, se si tratta di un'istanza di UISlider*
, diciamo _timeSlider
, basta fare quanto segue prima della dichiarazione di blocco:
UISlider* __weak slider = _timeSlider;
Quindi basta usare slider
all'interno del blocco. Tecnicamente questo è più preciso in quanto restringe il potenziale ciclo di mantenimento solo all'oggetto di cui hai bisogno, non a tutti gli oggetti all'interno self
.
Esempio completo:
UISlider* __weak slider = _timeSlider;
[_embeddedPlayer addPeriodicTimeObserverForInterval:CMTimeMake(1, 1)
queue:nil
usingBlock:^(CMTime time){
slider.value = time.value/time.timescale;
}
];
Inoltre, molto probabilmente l'oggetto che viene lanciato su un puntatore debole è già un puntatore debole all'interno self
, minimizzando o eliminando completamente la probabilità di un ciclo di mantenimento. Nell'esempio sopra, in _timeSlider
realtà è una proprietà memorizzata come riferimento debole, ad esempio:
@property (nonatomic, weak) IBOutlet UISlider* timeSlider;
In termini di stile di codifica, come per C e C ++, le dichiarazioni delle variabili vengono lette meglio da destra a sinistra. Dichiarare SomeType* __weak variable
in questo ordine si legge più naturalmente da destra a sinistra come: variable is a weak pointer to SomeType
.
timerDisp
una proprietà sulla classe?