2014-11-14 13 views
6

Próbowałem wykonać wiele badań dotyczących zrozumienia cykli zatrzymania. Nie mogę jednak znaleźć niczego na moich przykładach. Wiem, że jeśli ustawię właściwość na zamknięcie, wówczas zachodzi cykl zatrzymania i trzeba użyć słabego lub niezmienionego. Ale mam 2 przykłady, które chciałbym wiedzieć, jeśli są one wykonane poprawnie: Z góry dziękuję, próbowałem sprawdzić, czy są one na stackoverflow już, ale nie można znaleźć niczego.Swift Zachowaj cykle i zamknięcia

Proste animacje

UIView.transitionWithView(self, duration: 5, options: .TransitionCrossDissolve, animations: { [weak self] in 
    self?.setNeedsDisplay() 
    return 
}, completion: nil) 

animacji z tablicy

for imageView in self.townImages { 
    UIView.transitionWithView(imageView, duration: 0.3, options: .TransitionCrossDissolve, animations: {() -> Void in 
     imageView.image = UIImage(named: self.getImages()[count++]) 
    }, completion: nil) 
} 

W obu tych przykładach self to podklasa UIView. Chciałbym tylko wiedzieć, że robię to poprawnie lub jeśli powinienem używać również imageView jako słabego odniesienia. Dzięki.

Odpowiedz

2

Żadne z nich nie utworzy cykli zatrzymania, ponieważ blok nie jest dołączony do self. Dodatkowo, cykle zatrzymania z gwarantowaną żywotnością nie są najgorszą rzeczą na świecie.

Rozważmy kilka przykładów. (przepraszam, mój Swift nie jest szczególnie silna, więc mam zamiar wrócić do obj-c.)


- (void)doSomething:(void(^)())block { 
    self.block = block; 
} 

// elsewhere 
    [self doSomething:^{ 
    self.someProperty = 5; 
    }]; 

Stwarza to zachować cykl bo self odwołuje (nie słabo) w terminie blok, do którego odwołuje się self.


[UIView transitionWithView:self duration:5, options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ 
    [self setNeedsDisplay]; 
} completion:nil]; 

nie stworzyć zachować cykl ponieważ blok animations zostaje wysłany do systemu - Twój UIView podklasa nie posiada odniesienie do bloku.


uwaga Side: Nie należy trzeba mieć return na końcu zamknięcia, ale myślę, że Swift jest śmieszne i stara się być „pomocne”. Ponadto, nie jestem pewien, czy musisz wywoływać podczas animacji self.setNeedsDisplay(), ponieważ powinno to być samo w sobie ...

+0

Czy to oznacza, że ​​tworzy on tylko cykl zatrzymania, jeśli moja klasa zawiera odniesienie do bloku? lub czy metoda "UIView.transitionWithView" również spowodowałaby utworzenie cyklu zatrzymania? Innymi słowy, jeśli któraś z klas miała odniesienie do bloku, to tworzyłaby cykl zatrzymania? – smitt04

+1

również powrót w pierwszym przykładzie był taki, że w przypadku, gdy w zamknięciu zostało wykonane tylko jedno oświadczenie, to automatycznie zwracana jest ta wartość iw tym przypadku zamknięcie oczekiwało wartości zwracanej przez Void, więc używam instrukcji return, aby zwrócić pustkę, a nie wynik 'self? .setNeedsDisplay()' – smitt04

+1

Tak, dziwne, ale prawdziwe: w Swift * musisz * potrzebować zwrotu w tym przypadku. Jedna z dziwactw różnych reguł języka dla zamknięć jednej deklaracji. (A obecna wersja kompilatora zgłasza nieistotny i całkowicie mylący komunikat o błędzie, jeśli go tam nie ma ...) –