sobota, 27 lipca 2013

Lekcja 4, Reference Counter cz.1

Witam ponownie po dłuższej przerwie, mam nadzieje ostatniej takiej m.in ze względu na zmianę pracy, przygotowań do ślubu etc. :).

Dzisiaj postaram sie poruszyć temat dosyć ważny i od który powinnien być jednym z tych najbardziej podstawowych - zarządzanie pamięcią w Objective C. Na chwile obecną są dwie drogi zaczynając przygodę z programowaniem własnie w tym języku. Zacznę od tej, która chronologicznie pojawiła się pierwsza.

Non Automatic Reference Counter:

Najprościej ujmując każdy obiekt dziedziczacy po NSObject posiada mechanizm referencje do danego obiektu, dziedziczy również protokół NSObject, który narzuca implementacje metod do zarządzania pamięcią.

Każdy nowo utworzony obiekt przy użyciu metody init, otrzymuje dla licznika referencji +1.



    SimpleObject *simpleObject = [[SimpleObject alloc] init];
    
    NSLog(@"Simple Object reference counter = %d", [simpleObject retainCount]);


    Simple Object reference counter = 1




Zwiększanie licznika referencji odbywa się poprzez wywoływanie metody "retain" na obiekcie, zmniejszanie licznika poprzez "release".

    SimpleObject *simpleObject = [[SimpleObject alloc] init];
    NSLog(@"Simple Object reference counter = %d", [simpleObject retainCount]);
    [simpleObject retain];
    NSLog(@"Simple Object reference counter = %d", [simpleObject retainCount]);
    [simpleObject release];
    NSLog(@"Simple Object reference counter = %d", [simpleObject retainCount]);

    Simple Object reference counter = 1 
    Simple Object reference counter = 2
    Simple Object reference counter = 1 


Jeżeli tworzymy nowy obiekt lokalnie to musimy uważnie posługiwać się jego czasem życia wewnątrz danej metody. Powinniśmy zwalniać pamięć dla obiektu który już nie jest nam potrzebny. 


Warto teraz powrócić do składni charakterystycznej dla objective c, a mianowiście
@property i  @synthesize

Poniżej przykład, który znajdziemy w każdym nowym projekcie :

@property (retain, nonatomic) UIWindow *window;

@synthesize window = _window;

Słowo kluczowe retain wystapi jedynie dla projektów, w których używamy jedynie NARC
Powyższa składnia umożliwia nam utworzenie dostepu do zmiennej window, w innych językach programowania, żeby jawnie korzystać z pola danej klasy musielibyśmy dopisać metody dostepu do danego pola.
czyli :


- (void) setWindow:(UIWindow *)window{
    _window = window;
}

- (UIWindow *)window{
    return _window;
}

Na całe szczęście słowo kluczow synthesize daje nam to za free:), teraz wystarczy odwołować się poprzez self.window aby uzyskać dostęp do zmiennej.
Chciałbym się teraz chwile zatrzymać przy słowach kluczowych deklarowanych wewnątrz property. Dla przykładu powyżej :
- retain: oznacza, że przy każdej próbie przypisania referencji do obiektu, jego wartość - reference counter zostanie zwiększona o +1. oznacza to że self.window  = [[UIWindow alloc] init]; będzie oznaczało to samo co _window =[ [UIWindow alloc] init]; [window retain];

Po więcej informacji odsyłam :

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html


0 komentarze:

Prześlij komentarz