2011-11-02 10 views
17
  1. Jeśli oświadczam właściwość silna, jak w przykładzie:Czy self.iVar jest niezbędny do uzyskania mocnych właściwości z ARC?

    @property (strong, nonatomic) UIView *iVar; 
    

    Kiedy jestem ustawienie go, czy to ma znaczenie, jeśli robię iVar = ... lub self.iVar = ...? Wygląda na to, że z ARC robią to samo.

  2. Gdybym tylko zadeklarować instancji zmiennej (nie @property), np BOOL selected, to oznacza to wywieść być __unsafe_unretained (ponieważ nie ma właściwość określającą, że jest silny), czy muszę jednoznacznie określić, że?

Wydaje się, że mogę nie odpowiedział na moje własne pytania powyżej w odpowiedzi ARC: How to release static variable?, ale nadal jestem nieco zdezorientowany na powyższe pytania.

Odpowiedz

20

Z punktu widzenia zarządzania pamięcią, używając ivar = ... lub self.property = ... (uwaga: nie ma czegoś takiego jak self.ivar) są takie same. Jednak użycie ivar = ... nie wywołuje settera, gdy robi to self.property = .... Ma to istotne konsekwencje 3, w przypadkowej kolejności:

  1. Jeżeli nieruchomość nie jest oznaczony nonatomic, a następnie uzyskać dostęp do podstawowych ivar nie weźmie blokadę i będzie łamanie implikacje atomowości.
  2. Jeśli właściwość zostanie nadpisana przez ciebie lub podklasę, przesłonięty program ustawiający nie zostanie wywołany.
  3. Powiadomienia KVO nie będą wysyłane.

Co do deklarowania tylko ivar, ma tę samą semantykę zarządzania pamięcią, co deklarowanie zmiennej lokalnej. Zostało to udokumentowane w dokumencie section 4.4 of the Objective-C Automatic Reference Counting, ale zasadniczo, jeśli jest to obiekt, zostanie on wywnioskowany jako __strong.

+0

@kaka: Nie. Trójpróbkowy kontrprzykład: przypisanie struktury większej niż pojedyncze słowo prawie na pewno nie jest atomowe bez względu na ARC/MRR. –

Powiązane problemy