+ Odpowiedz na ten temat
Strona 2 z 2 PierwszaPierwsza 1 2
Pokaż wyniki od 11 do 16 z 16

Temat: nie ma release, nie ma leak? Dlaczego?

  1. #11
    Avatar macieks72
    Dołączył
    Aug 2009
    Postów
    8,750
    initWith oczywiście tworzy obiekt, i ma zaimplementowane autorelease w swojej klasie, a samo init nie i musisz to autrelease sam dodać. Przynajmniej tak jest z NSString.

    Natomiast nie bardzo rozumiem co dokładnie masz na myśli przez:
    "nie czyni mnie właścicielem obiektu?"

    Oczywiście obiekt jest tworzony w obu przypadkach, chodzi tylko o ten autorelease.

    Chodzi o to że jak nie ma autorelease to NSAutoreleasePool nie zniszczy takiego obiektu, musisz go sam zniszczyc dając [obiekt release]

    Jestem początkujący, ale wydaje mi się że dobrze mówię
    Ostatnio edytowane przez macieks72 ; 07.03.2010 o 16:40
    Komputer: Macbook Pro - Mac OS X 10.7.3
    Telefon: iPhone 4 - iOS 5.0.1
    Cytuj Cytuj  


  2. #12
    Avatar insekt
    Dołączył
    Oct 2007
    Skąd
    Warszawa
    Postów
    346
    Mam na myśli że to ja jestem odpowiedzialny za wysłanie release do tego obiektu.

    A nie jest przypadkiem tak, że fakt zastosowania alloc czyni mnie odpowiedzialnym za wysłanie release?
    Ostatnio edytowane przez insekt ; 07.03.2010 o 16:43
    Komputer: MB 2.0GHz X3100 4GB 10.6.2 | Samsung 250GB 7200rpm
    Telefon: iPhone 3G 16GB
    Cytuj Cytuj  

  3. #13
    Avatar macieks72
    Dołączył
    Aug 2009
    Postów
    8,750
    Ogólnie tak, ale tylko jeśli nie stosujesz NSAutoreleasePool i jeśli obiekt nie jest tworzony z autorelease. Wtedy musisz sam go zniszczyć. W innym przypadku zajmie się tym właśnie NSAutoreleasePool który też musisz dodać do swojego kodu.

    A tak naprawdę zależy jakie założenia przyjmiesz w swoim kodzie, bo możesz:
    1. Korzystać z Garbage Collectora i się niczym nie przejmować.
    2. Z NSAutoreleasePool, wtedy obiekty tworzone z autorelease będą w puli niszczone.
    3. Albo samemu zadbać o niszczenie obiektów przez [obiekt release]

    4. Albo jeszcze można pomieszać te 3 rzeczy wyżej, ale to już się będzie prosiło o potencjalne wycieki pamięci, bo łatwo będzie coś przeoczyć.

    EDIT:
    Przydałby się ktoś bardziej doświadczony w tej dyskusji, żeby potwierdzić czy mam rację Bo jestem też początkujący.
    Ostatnio edytowane przez macieks72 ; 07.03.2010 o 16:49
    Komputer: Macbook Pro - Mac OS X 10.7.3
    Telefon: iPhone 4 - iOS 5.0.1
    Cytuj Cytuj  

  4. #14
    Avatar insekt
    Dołączył
    Oct 2007
    Skąd
    Warszawa
    Postów
    346
    Metoda 3 mi na razie najbardziej odpowiada w takim razie.
    Komputer: MB 2.0GHz X3100 4GB 10.6.2 | Samsung 250GB 7200rpm
    Telefon: iPhone 3G 16GB
    Cytuj Cytuj  

  5. #15
    fts
    fts jest offline

    Dołączył
    Nov 2006
    Postów
    22
    Jezeli podczas tworzenia obiektu korzystasz z metody o nazwie zaczynajacej sie od init, new albo copy, Twoim obowiazkem jest uwolnienie tego obiektu z wykorzystaniem metody release. initWithInt zaczyna sie od init, wiec powinienes dodac [number0 release] do programu.

    Wracajac do problemu, "dziwne" zachowanie Twojego programu jest wynikiem zastosowanej optymalizacji. NSNumber jest "non-mutable" i zamiast tworzyc nowy obiekt dostales referencje do obiektu juz istniejacego. Na przyklad, jezeli uruchomisz program:

    Kod:
    int main (int argc, const char * argv[]) {
        NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    
        for (int i = 0; i < 100; ++i) {
            NSNumber *number = [[NSNumber alloc] initWithInt:0];
        }
            
        NSNumber *numberTest = [[NSNumber alloc] initWithInt:0];
        NSLog(@"Retain count: %d", [numberTest retainCount]);
            
        [pool drain];
        return 0;
    }
    to zobaczysz, ze retain count dla 'numberTest' wynosi 102, z czego 101 pochodzi z powyzszego programu, a 1 z biblioteki.

    Jezeli stworzysz obiekt nie dla 0, a dla 13, powinienes zaobserwowac wyciek.

    Pozdrawiam,
    fts
    Ostatnio edytowane przez fts ; 08.03.2010 o 05:20
    Cytuj Cytuj  

  6. #16
    Avatar izydor86
    Dołączył
    Sep 2008
    Skąd
    Zurych/Kraków
    Postów
    90
    Z dokumentacji:

    You own any object you create.
    You “create” an object using a method whose name begins with “alloc” or “new” or contains “copy” (for example, alloc, newObject, or mutableCopy).

    Wysyłasz tylko do takich obiektów release.
    Cytuj Cytuj  

+ Odpowiedz na ten temat
Strona 2 z 2 PierwszaPierwsza 1 2