Odpowiedz na ten temat
Strona 1 z 2 1 2 OstatniaOstatnia
Pokaż wyniki od 1 do 10 z 16
  1. Avatar tmkszlc
    Dołączył
    Sep 2008
    Skąd
    Koszalin
    Postów
    947

    Cytuj | #1

    Witam, przejdę od razu do problemu.

    Mam klasę Widok1, w której są UIButtony, UIImageView po kilka sztuk. Obiekt typu Widok1 wywoluje w klasie ViewController. Moje pytanie jest następujące: Czy przy zakończeniu pracy z obiektem typu Widok1 i zrobieniu obiektWidok1 = nil; muszę wcześniej w klasie obiektu zrobić to samo z jej obiektami? tzn czy muszę zrobić funkcję, która przypisze każdemu obiektowi wartość nil?
    Komputer: MacBook Pro 17 2010 i7 Matt
    Telefon: iPhone 3G 16GB
    Odtwarzacz: iPhone 3G 16GB
    Tablet: The new iPad 32GB WiFi + 4G
    


  2. Avatar Acryl
    Dołączył
    Jul 2010
    Postów
    109

    Cytuj | #2

    Hej,

    przypisanie obiektowi wartości nil nie powoduje zwolnienia tego obiektu, a jedynie wyzerowanie wskaźnika na niego. Innymi słowy obiekt zostaje Ci w pamięci, tylko tracisz do niego dostęp, czyli jego adres. Żeby zwolnić obiekt należy użyć metody release. W Twoim przypadku [obiektWidok1 release];. Jeśli masz w tym obiekcie zdefiniowane i zaalokowane jakieś inne obiekty np. UIButton, UILabel, to musisz je zwolnić wcześniej ręcznie, albo upewnić się czy w metodzie dealloc jest dodane ich zwalnianie. Najlepiej dodać do dealloc zwalnianie wszystkich obiektów(używając dla każdego z nich metody release). Jeśli do dodawania obiektów używałeś IB, wówczas w metodzie dealloc powinny być kody do ich zwalniania.

  3. Avatar tmkszlc
    Dołączył
    Sep 2008
    Skąd
    Koszalin
    Postów
    947

    Cytuj | #3

    @Arcyl, dzięki za odpowiedź, muszę jeszcze dużo poczytać. Tylko, że ja nie mogę użyć release, ponieważ korzystam z ARC(?) Automatic Reference Counting czy jakoś tak. Jak w takim razie "przestać" pracować, wyrzucić z pamięci obiektWidok1?
    Komputer: MacBook Pro 17 2010 i7 Matt
    Telefon: iPhone 3G 16GB
    Odtwarzacz: iPhone 3G 16GB
    Tablet: The new iPad 32GB WiFi + 4G
    

  4. Avatar Lestek
    Dołączył
    Apr 2007
    Postów
    827

    Cytuj | #4

    Skoro korzystasz z ARC to nie musisz zawracać sobie głowy zwalnianiem pamięci...
    Komputer: Mac
    Telefon: iPhone 4S
    Tablet: iPad1 16GB, The new iPad 32GB

  5. uho
    Mężczyzna uho jest offline
    Avatar uho
    Dołączył
    Mar 2008
    Skąd
    Łuków, PL
    Postów
    135

    Cytuj | #5

    dzięki ARC życie jest o wiele prostsze
    Telefon: iPhone 4S 16GB
    Odtwarzacz: iPod Nano 4G
    Tablet: iPad2 3G 16G
    WWW: http://www.tomaszbuziak.com

  6. Avatar tmkszlc
    Dołączył
    Sep 2008
    Skąd
    Koszalin
    Postów
    947

    Cytuj | #6

    Poczytałem troszkę o ARC, ale i tak nie do końca rozumiem. Tworzę obiekt klasy Klasa1 w ViewController (zadeklarowany w .h). Standardowo obiekt ten jest poprzedzony kwalifikatorem '__strong', czyli że obiekt nie będzie deallocowany w przeciwieństwie do '__weak', tak? Jeśli tak, to po użyciu już mojego obiektu, chciałbym by był zniszczony, bo po co ma zajmować pamięć skoro nie będzie potrzebny, a jeśli będzie to stworzy się go jeszcze raz. Co mam w takim wypadku zrobić? Dodam iż obiekt na pewno nie jest nieszczony/ usuwany z pamięci bo mogę go użyć w każdym momencie działania aplikacji, chyba że nie wiem co znaczy niszczyć obiekt / zwalniać pamięć.
    Komputer: MacBook Pro 17 2010 i7 Matt
    Telefon: iPhone 3G 16GB
    Odtwarzacz: iPhone 3G 16GB
    Tablet: The new iPad 32GB WiFi + 4G
    

  7. Avatar Acryl
    Dołączył
    Jul 2010
    Postów
    109

    Cytuj | #7

    release i po sprawie .

  8. Avatar tmkszlc
    Dołączył
    Sep 2008
    Skąd
    Koszalin
    Postów
    947

    Cytuj | #8

    no właśnie nie XD jeśli używam ARC to nie mogę użyć release bo będzie Build Failed : /
    Komputer: MacBook Pro 17 2010 i7 Matt
    Telefon: iPhone 3G 16GB
    Odtwarzacz: iPhone 3G 16GB
    Tablet: The new iPad 32GB WiFi + 4G
    


  9. Dołączył
    Dec 2010
    Skąd
    Kraków
    Postów
    18

    Cytuj | #9

    Zrób sobie dla tego obiektu klasy Klasa1:

    w .h
    @property (nonatomic, strong) Klasa1 *obiekt;

    w m.
    @synthesize obiekt = _obiekt;

    Jak tworzysz obiekt korzystaj z @property -> self.obiekt = <tutaj inicjalizacja>
    Jak już nie chcesz go dalej używać ustawiaj @property na nil -> self.obiekt = nil;

    Domyślnie generowany setter z atrybutami (nonatomic, strong) powinien wewnętrznie zrobić "release" na starym obiekcie zanim przypisze nil.
    Komputer: Mac Mini, PC

  10. Avatar tmkszlc
    Dołączył
    Sep 2008
    Skąd
    Koszalin
    Postów
    947

    @gzajac, dzięki ; ) A teraz jeśli mógłbyś mi wytłumaczyć jedną rzecz. Kiedyś czytałem czyjeś wypowiedzi, ale nie zrozumiałem. Więc:

    1. Co daje @synthesize obiekt = _obiekt? Tak patrzę i nie mogę tego zrozumieć.
    2. Jaka jest różnica (prócz tej, że nie można odwołać się do obiektu jako property klasy poprzez self.obiekt) między obiektem klasy Klasa1, który będzie zadeklarowany w @property klasy, a tym stworzonym jako 'normalny' obiekt w .h w nawiasach klamrowych?
    Komputer: MacBook Pro 17 2010 i7 Matt
    Telefon: iPhone 3G 16GB
    Odtwarzacz: iPhone 3G 16GB
    Tablet: The new iPad 32GB WiFi + 4G
    

Odpowiedz na ten temat
Strona 1 z 2 1 2 OstatniaOstatnia