2013-09-23 14 views
9

parsowania przez ten document on class clusters, NSNumber realizuje initWithChar: w przybliżeniu następujący sposób:Cluster inicjalizatory z ARC

- (id)initWithChar:(char)c 
{ 
    [self release]; 
    return [[__NSCharNumber alloc] initWithChar:c]; 
} 

Podobnie, można użyć tego wzoru do inicjowania widoki z NIB:

- (id)initWithFrame:(CGRect)frame 
{ 
    id realSelf = [[self class] nib] instantiateWithOwner:nil options:nil][0]; 
    realSelf.frame = frame; 
    [self release]; 
    return realSelf; 
} 

I Zastanawiam się, czy ARC zarządza wydaniem niezwróconego self w tych przypadkach? Czy jest to udokumentowane w dowolnym miejscu?

+0

To są "klastry klas", a nie "klasy klastrów". – jlehr

Odpowiedz

6

Znaleziono szczegóły in the clang documentation.

init pośrednio używa atrybutu __attribute__((ns_consumes_self)), co oznacza, że ​​podczas self jest zdefiniowana jako __strong id self początkowy przydział nie wykonuje zachowania. Oznacza to, że po zmianie przypisania self lub zakończeniu funkcji, self zostanie zwolniony przy użyciu standardowych silnych reguł.

Aby uzyskać +1, pojawia się ukryty __attribute((ns_returns_retained)), który uniemożliwia zwrócenie zwróconego obiektu na końcu.

Na wysokim poziomie, ARC planuje zwolnić początkową wartość self jeden dodatkowy czas do końca funkcji, jednocześnie zachowując wartość zwrotną, utrzymując +1 wynik.

+0

Dziękuję, Brian. Czy mógłbyś pokazać, jak będzie wyglądał kod? – Slabko

+1

@Slabko Nie ma nic innego, jak tylko zwrócenie nowej instancji podklasy w 'initWith ...'. Złożyłem tutaj kilka przykładów klastrów klas: https://github.com/bnickel/Cluster-Initializer-Examples –

3

Byłby on objęty standardowymi zasadami własności obiektu ARC, przy czym "niezwrócony self" zakończyłby się bez silnych odniesień, a zatem zostałby automatycznie zwolniony, gdy nie wchodzi w zakres.