2012-12-06 12 views
7

Należy rozważyć następujące kwestie: Instancji klasy Objective-C odwołuje się za pomocą jednego silnego odniesienia i jednego słabego odniesienia (w ramach ARC). W wątku X, metoda jest wywoływana na instancji przez słabe odniesienie. W wątku Y silna referencja jest zerwana tak, że nie ma już silniejszych odniesień do instancji i powinna zostać zwolniona.Czy obiekt Objective-C może zostać zwolniony podczas wywoływania metody instancji?

Czy ta sytuacja jest możliwa, ponieważ obiekt może zostać zwolniony w wątku Y, gdy metoda jest wykonywana w wątku X? Podobnie, czy wywołanie metody na obiekcie "zachowuje" ten obiekt, dopóki metoda nie zwróci?

Odpowiedz

10

ARC faktycznie zachowuje słabe referencje przed wywołaniem metod instancji na nich i zwalnia po wywołaniu.

Badałem ten problem i został poprawiony przez kolegę po pokazaniu mu to pytanie stackoverflow. Wskazał na to: http://lists.apple.com/archives/objc-language/2012/Aug/msg00027.html

Oczywiście w zespole ARC zatrzymuje się i zwalnia wokół inwokacji na słabym sygnale.

Pewnym razem, gdy będziesz chciał słuchać CLANG_WARN_OBJC_RECEIVER_WEAK, będziesz sprawdzać zero, gdy zero może spowodować błąd.

if (self.weakRefToParent) { 
    //self.weakRefToParent could be dealloced and set to nil at this line 
    NSString *name = [self.weakRefToParent name]; //CLANG_WARN_OBJC_RECEIVER_WEAK warning 
    [self.namesArray addObject:name]; //name is nil, NSInvalidArgumentException 
} 

Jest to bezpieczniejszy sposób:

Parent *strongRefToParent = self.weakRefToParent; 
if (strongRefToParent) { 
    NSString *name = [strongRefToParent name]; 
    [self.namesArray addObject:name]; 
} 
+2

Znacznie lepiej odpowiedź (jak w „dokładny i na podstawie ostatecznej odpowiedzi kompilator autora”). Dzięki! – bbum

Powiązane problemy