+ Odpowiedz na ten temat
Strona 1 z 2 1 2 OstatniaOstatnia
Pokaż wyniki od 1 do 10 z 16

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

  1. #1
    Avatar insekt
    Dołączył
    Oct 2007
    Skąd
    Warszawa
    Postów
    346

    nie ma release, nie ma leak? Dlaczego?

    Witam

    Z Objective C jeszcze raczkuję, ale mam już trochę pisanego materiału za sobą. To tylko tak na wstępie dla wyjaśnienia, a do rzeczy.

    Jeśli przykładowo mam w kodzie:

    Kod:
    NSNumber * number0 = [[NSNumber alloc]initWithInt:0];
    a nigdzie później nie występuje
    Kod:
    [number0 release];
    to czy przypadkiem podczas puszczenia takiego kodu, tym bardziej w pętli nie Leak Performance Tool nie powinien mi pokazywać leaków pamięci? Bo niestety nie pokazuje i po prostu czegoś nie rozumiem tutaj.

    Z góry bardzo dziękuję za pomoc.
    Komputer: MB 2.0GHz X3100 4GB 10.6.2 | Samsung 250GB 7200rpm
    Telefon: iPhone 3G 16GB
    Cytuj Cytuj  


  2. #2

    Dołączył
    Sep 2009
    Postów
    12
    Witam, podłączam się pod pytanie też mam taki kawałek kodu z sampla SDK apropo aimacji:

    CATransition *transition = [CATransition animation];

    a nigdzie nie ma [transtion release].
    Cytuj Cytuj  

  3. #3
    Avatar imrik
    Dołączył
    Aug 2005
    Skąd
    Wrocław, Poland
    Postów
    1,994
    a nie ma przypadkiem czegoś tego typu w kodzie implementacji?:

    Kod:
    #import osoba.h
    
    @implementation Osoba
    
    - (void)dellaoc {
        //Czyścimy co potrzebujemy
        //...
    
       //Kiedy kończymy wywołujemy super aby wszystko poczyścił
       [super dealloc];
    }
    
    @end
    Komputer: iMac 20" Early 2009 + MacBook Late 2008 + Snow Leopard
    Telefon: iPhone 3G 16GB
    Odtwarzacz: iPhone 3G 16GB
    Cytuj Cytuj  

  4. #4
    Avatar Roberto
    Dołączył
    Feb 2007
    Skąd
    Wrocław
    Postów
    11,660
    zaleta 10.5 i garbage collectora przypadkiem? ;]
    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
    Cytuj Cytuj  

  5. #5
    Avatar mormon
    Dołączył
    Nov 2005
    Skąd
    Wrocław
    Postów
    13
    A nie zadzialal autorelease?
    Komputer: MacBook C2D 1,83GHz, MacOSX Snow Leopard
    Telefon: Era G1
    Odtwarzacz: iPod Touch
    Cytuj Cytuj  

  6. #6
    Avatar macieks72
    Dołączył
    Aug 2009
    Postów
    8,750
    Garbage Collector z tego co się orientuję trzeba załączyć w opcjach kompilatora w xcode, domyślnie jest unsupported. No i autor nie napisał nic czy to pod iPhone czy nie, bo jak tak to tam nie ma Garbage Collectora.

    Ale dopiero zaczynam z obj-c także mogę się mylić.

    Na początek też dobrym pomysłem jest w " -(void) dealloc" w swoich klasach, dać np. NSLog ("Nazwa klasy - dealloc");
    Ja tak właśnie sobie śledziłem co się dzieje, bo też mam problemy z pojęciem tych retain, drain, autorelease itd.

    Ale jeszcze jedno, jak masz w kodzie np. w main() cos takiego, to automatycznie pamięć zwolni:
    Kod:
     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    .....
    [pool release]
    Mam nadzieje że dobrze mówię bo jestem początkujący w tym dopiero
    Ostatnio edytowane przez macieks72 ; 06.03.2010 o 02:14 Powód: literówki
    Komputer: Macbook Pro - Mac OS X 10.7.3
    Telefon: iPhone 4 - iOS 5.0.1
    Cytuj Cytuj  

  7. #7
    Avatar mormon
    Dołączył
    Nov 2005
    Skąd
    Wrocław
    Postów
    13
    ja też ostatnio zacząłem uczyć się objective-c . jest fajny kurs na iTunes U. w każdym razie z tego co rozumiem to autorelease właśnie tak się uruchamia i działa on w ten sposób że po każdym przejściu pętli obsługi komunikatów w systemie, system zwalnia wszystko co jest w autorelease pool. chyba większość klas z biblioteki "standardowej" obsługuje właśnie autorelease pool.
    Komputer: MacBook C2D 1,83GHz, MacOSX Snow Leopard
    Telefon: Era G1
    Odtwarzacz: iPod Touch
    Cytuj Cytuj  

  8. #8
    Avatar insekt
    Dołączył
    Oct 2007
    Skąd
    Warszawa
    Postów
    346
    Uporządkowałem kod, przepisałem i teraz jest ok. Najwyraźniej musiałem coś namieszać. Jak odgrzebię jakiś backup to wrzucę cały kod, może uda się nam wyjaśnić gdzie coś przeoczyłem.
    Komputer: MB 2.0GHz X3100 4GB 10.6.2 | Samsung 250GB 7200rpm
    Telefon: iPhone 3G 16GB
    Cytuj Cytuj  

  9. #9
    Avatar macieks72
    Dołączył
    Aug 2009
    Postów
    8,750
    Z tego co się orientuje to te wszystkie "initWith" przy tworzeniu obietu mają w konstruktorze swojej klasy dodane autorealease, a te z samym "init" nie. Ale można dodać przy tworzeniu obiektu to autorelease np.

    NSString *data = [[[NSString alloc] init] autorelease];

    A to niżej już ma w kontruktorze klasy w -(void) init dodane autorelease i nie trzeba dodawac tego jawnie jak wyzej, ale tez mozna.

    NSString *data = [[NSString alloc] initWithFormat:@"%@", @"aaaaa"];

    i wtedy NSAutoreleasePool zadziała.

    To wyżej do z gotowymi klasami.

    A do swoich klas mozna dodać autorelease w init i wtedy NSAutoreleasePool rownież zadziała.
    Kod:
    @implementation Person
    - (id) init
    {
    	self = [super init];
    	[self autorelease];
    	
    
    	firstname = [[NSString alloc] init];
    	lastname = [[NSString alloc] init];	
    	return self;
    }
    - (void) dealloc
    {
    	[firstname release];
    	[lastname release];
    	[super dealloc];
    }
    Dodaj sobie w init i dealloc jakiś NSLog żeby obserwować co się dzieje. Przydaje się żeby zrozumieć to.
    Ostatnio edytowane przez macieks72 ; 06.03.2010 o 22:46
    Komputer: Macbook Pro - Mac OS X 10.7.3
    Telefon: iPhone 4 - iOS 5.0.1
    Cytuj Cytuj  

  10. #10
    Avatar insekt
    Dołączył
    Oct 2007
    Skąd
    Warszawa
    Postów
    346
    Jesteś pewien na 100% że initWith nie czyni mnie właścicielem obiektu?

    I drugie pytanie, czy da się określić czy lepiej samemu zwalniać pamięć czy wrzucać obiekty do AutoreleasePool? Bo Garbage Collector mnie nie interesuje raczej. Natomiast nie mogę znaleźć rozpisanych wad i zalet dwóch pierwszych metod.
    Komputer: MB 2.0GHz X3100 4GB 10.6.2 | Samsung 250GB 7200rpm
    Telefon: iPhone 3G 16GB
    Cytuj Cytuj  

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