Hinzufügen von zwei Cent zur Verbesserung von Präzision und Stil. In den meisten Fällen verwenden Sie self
in diesem Block nur ein oder mehrere Mitglieder von , wahrscheinlich nur, um einen Schieberegler zu aktualisieren. Casting self
ist übertrieben. Stattdessen ist es besser, explizit zu sein und nur die Objekte zu werfen , die Sie wirklich benötigen, innerhalb des Blocks. Zum Beispiel, wenn es eine Instanz ist UISlider*
, sagen wir, _timeSlider
tun gerade folgendes vor dem Block Erklärung:
UISlider* __weak slider = _timeSlider;
Dann einfach slider
innerhalb des Blocks verwenden. Technisch gesehen ist dies genauer, da der potenzielle Aufbewahrungszyklus nur auf das Objekt beschränkt wird, das Sie benötigen, nicht auf alle Objekte im Inneren self
.
Vollständiges Beispiel:
UISlider* __weak slider = _timeSlider;
[_embeddedPlayer addPeriodicTimeObserverForInterval:CMTimeMake(1, 1)
queue:nil
usingBlock:^(CMTime time){
slider.value = time.value/time.timescale;
}
];
Darüber hinaus ist das Objekt, das in einen schwachen Zeiger umgewandelt wird, höchstwahrscheinlich bereits ein schwacher Zeiger im Inneren, self
wodurch die Wahrscheinlichkeit eines Aufbewahrungszyklus minimiert oder vollständig beseitigt wird. Im obigen Beispiel _timeSlider
ist tatsächlich eine Eigenschaft als schwache Referenz gespeichert, z.
@property (nonatomic, weak) IBOutlet UISlider* timeSlider;
In Bezug auf den Codierungsstil werden Variablendeklarationen wie bei C und C ++ besser von rechts nach links gelesen. Die Erklärung SomeType* __weak variable
in dieser Reihenfolge lautet natürlicher von rechts nach links als : variable is a weak pointer to SomeType
.
timerDisp
eine Eigenschaft in der Klasse?