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

    Cytuj | #1

    Mam następujące pytanie, na które nie znalazłem odpowiedzi: wyobraźmy sobie sytuację, gdzie do wskaźnika danego obiektu przypisujemy jeden obiekt, a potem kolejny, np:

    NSString *s1 = [[NSString alloc] initWithString:@"ala"];
    s1 = [[NSString alloc] initWithString:@"ola"];


    Czy pomiędzy linijkami 1 i 2 powinniśmy najpierw zwolnić pierwszy obiekt ([s1 release]) i dopiero potem podstawić nowy, czy podczas podstawiania obiekt jest automatycznie zwalniany ?
    Komputer: MacBook Pro 15" Late 2007
    Telefon: iPhone 4


  2. Avatar Roberto
    Dołączył
    Feb 2007
    Skąd
    Wrocław
    Postów
    11,859

    Cytuj | #2

    tylko tu nie ma żadnego 'podstawiania' obiektów. To tylko 'adres' jest zmieniany.
    ogólnie - tak, musisz.
    Komputer: MacBook Pro 13,3" 2,26GHz (Lion 10.7.3)
    Telefon: iPhone 4S
    Tablet: iPad 2 3G
    dlaczego nie korzystasz z opcji szukaj?
    http://ifiboughtyourappalreadycaniup...acappstore.com

  3. Avatar kamil.burczyk
    Dołączył
    Jan 2011
    Skąd
    Kraków
    Postów
    46

    Cytuj | #3

    Dzięki za odpowiedź, jak wrócę do domu to przetestuję.
    Komputer: MacBook Pro 15" Late 2007
    Telefon: iPhone 4

  4. Avatar piotrpsz
    Dołączył
    Feb 2011
    Skąd
    Poznań, PL
    Postów
    17

    Cytuj | #4

    Jesli uzytkownik/obiekt tworzy obiekty z uzyciem slow 'init', 'copy' itd (patrz dokumentacja obiective-c), sam powinien je zwalniac, lub jesli tego nie robi powinien wpisac w dokumentacji/komentarzach, ze ich uzytkownik powinien to zrobic. Jesli nikt tego nie zrobi w trakcie dzialania programu beda powstawaly tzw. memory leaks. Zakonczenie programu zwalnia wszystkie przedzielone i niezwolnione do tej pory zasoby.
    Komputer: iMac, MacBook Pro
    Telefon: iPhone 3GS

  5. Avatar kamil.burczyk
    Dołączył
    Jan 2011
    Skąd
    Kraków
    Postów
    46

    Cytuj | #5

    Takie podstawy to ja znam Zróbmy krótkie case study bo dalej mi coś nie gra.
    Mamy taki kod:

    Kod:
        
    1. NSString *s1 = [[NSString alloc] initWithUTF8String:"ala"];
    2. NSString *s2 = [[NSString alloc] initWithUTF8String:"ola"];
    3. NSLog(@"%d %@", [s1 retainCount], s1);
    4. [s1 release];
    5. NSLog(@"%d %@", [s1 retainCount], s1);
    6. s1 = s2;
    7. NSLog(@"%d %@", [s1 retainCount], s1);
    8. [s1 release];
    9. NSLog(@"%d %@", [s2 retainCount], s2);
    Po odpaleniu wypisuje on:

    Kod:
    1 ala
    1 ala
    1 ola
    1 ola
    Dlaczego tak ?

    Linijka 3. rozumiem, nowo zaalokowana i zainicjowana zmienna ma retainCount równe 1. Ale dlaczego po jej zwolnieniu dalej jest 1 ? Tak samo linijka 7. Ustawiam dwa wskaźniki na String "ola", retainCount = 1, wypisuje się ok, ale jak zwolnię jeden z nich to retainCount zostaje bez zmian. WTF ?
    Komputer: MacBook Pro 15" Late 2007
    Telefon: iPhone 4

Odpowiedz na ten temat

Tagi dla tego tematu