Odpowiedz na ten temat
Pokaż wyniki od 1 do 3 z 3
  1. Avatar kamil.burczyk
    Dołączył
    Jan 2011
    Skąd
    Kraków
    Postów
    46

    Cytuj | #1

    Natknąłem się dzisiaj (a właściwie zrozumiałem jego sens) na następujący problem:
    W modelu danych dla aplikacji mam 2 klasy: A i B.
    A ma wskaźnik do obiektów typu B (B* obiektB), B ma tablicę elementów typu A (NSMutableArray *tablicaA). Po wczytaniu modelu liczniki retainCount wynoszą przykładowo: 10 dla A i 5 dla B.
    Teraz robię update modelu i wyżej w aplikacji podstawiam całkiem nowe obiekty, np:
    Kod:
    wskaźnikDoA = [[A alloc] init]; 
    wskaźnikDoB = [[B alloc] init];
    W tym momencie, jako że oba wskaźniki są zadeklarowane jako
    Kod:
    @property (nonatomic, retain)
    , wywoływany jest setter i dla każdego z nich wołany jest release jeden raz. Wtedy nasze retainCount wynoszą 9 dla A i 4 dla B, tracimy oczywiście wskaźniki do starych obiektów, bo podstawiłem nowe i mam wyciek pamięci.
    Spotkał się ktoś kiedyś z takim problemem ? Jak można to ogarnąć, żeby zdealokować cały stary model i zastąpić go nowym ?
    Ostatnio edytowane przez kamil.burczyk ; 23.08.2011 o 20:36
    Komputer: MacBook Pro 15" Late 2007
    Telefon: iPhone 4


  2. Avatar pio11
    Dołączył
    Mar 2008
    Postów
    1,591

    Cytuj | #2

    A nie zadziała:

    [wskaźnikDoA dealloc]
    Komputer: Mac Mini C2D 2.0 | 120 GB | 500 GB | 3 GB RAM | Lion
    Telefon: LG-P500 iPhone 3G 16 GB | 4.2.1 - R.I.P
    Tablet: iPad 32 GB WiFi - 3G - znaleziono pod choinką


  3. Dołączył
    Feb 2010
    Postów
    222

    Cytuj | #3

    Tworząc obiekt:
    Kod:
    wskaznikDoA = [[A alloc] init];
    Jesteś odpowiedzialny za ręczne usunięcie go, więc gdzieś w kodzie musisz umieścić:
    Kod:
    [wskaznikDoA release];
    Dobrą praktyką jest, aby nie tworzyć obiektów używając metod zaczynających się od "init", tylko korzystać z metod, które automatycznie wykonują "autorelease". przykład:
    Kod:
    obiekt.tab1 = [NSArray arrayWithCapacity:10];
    obiekt.tab2 = [[NSArray alloc] initWithCapacity:10];
    gdzie tab1 i tab2 są zdefiniowane
    Kod:
    @property(retain) NSArray tab1;
    @property(retain) NSArray tab2;
    W momencie usunięcia "obiekt" tab1 zostanie uwolniony, a tab2 nie, tworząc wyciek.
    Moje aplikacje w AppStore:
    Blicks.

Odpowiedz na ten temat

Tagi dla tego tematu