autorelease

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • autorelease

    Hallo,
    es wird immer gesagt, dass immer wenn man ein Object mit initWith... initialisiert, dass dann immer ein "autorelease" an das Object automatisch geschickt wird.

    Das Object wird also dem obersten "autorelease pool" auf dem Autorelasestack hinzugefügt.
    Das Object wird freigegeben, wenn zum pool eine "drain" oder eine "release" nachricht geschickt wird, ansonsten nicht?

    Wenn ein Object eine "autorelease" Nachricht erhällt dann wird doch der retain count auf ffff... gesetzt. Also bring mir ein release aufs Object nix?.
    Ich habe aber auch gelesen, dass der pool einfach x-mal die "release" Nachricht zum Object schickt, halt so oft wie der retain count vom Object ist, aber da stimmt was nicht oder? der retain count ist doch auf ffff.. gesetzt?

    Und noch hier zu(Code aus Doku.. von Apple):
    - (void)applicationDidFinishLaunching:(UIApplication *)application {

    // Create the window object and assign it to the
    // window instance variable of the application delegate.

    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    window.backgroundColor = [UIColor whiteColor];


    // Create a simple red square

    CGRect redFrame = CGRectMake(10, 10, 100, 100);
    UIView *redView = [[UIView alloc] initWithFrame:redFrame];
    redView.backgroundColor = [UIColor redColor];

    // Create a simple blue square
    CGRect blueFrame = CGRectMake(10, 150, 100, 100);
    UIView *blueView = [[UIView alloc] initWithFrame:blueFrame];
    blueView.backgroundColor = [UIColor blueColor];

    // Add the square views to the window

    [window addSubview:redView];
    [window addSubview:blueView];

    // Once added to the window, release the views to avoid the
    // extra retain count on each of them.

    [redView release]; //<----------------------------- release
    [blueView release]; //<----------------------------- release
    // Show the window.
    [window makeKeyAndVisible];

    }

    Die Views werden ja mit einem initWith initialisiert wieso noch ein release?
  • wenn du ein [[NSClassName alloc] initWith...] oder nur init] machst bekommst du eine Instanz mit Retain Count 1 zurück. Zu diesem Zeitpunkt wurde die Instanz NOCH NICHT dem ARP hinzugefügt.
    Die Instanz wird erst hinzugefügt wenn du explizit ein -autorelease sendest.


    Wenn du im AppKit arbeitest hast du automatisch ein darunterliegendes ARP.

    Ansonsten musst du ein ARP selber allozieren (das liegt dann über dem AppKit ARP). Das kannst du dann drainen oder releasen (Aber es schickt nicht die Nachricht -release so lange an das Objekt bis dessen Retaincount auf 0 fällt!)
    enum { NSNoInterfaceStyle = 0, // Default value for window's interfaceStyle
  • RE: autorelease

    Original von franz
    Hallo,
    es wird immer gesagt, dass immer wenn man ein Object mit initWith... initialisiert, dass dann immer ein "autorelease" an das Object automatisch geschickt wird.

    Wer sagt das? Das ist auch falsch.

    Wenn manein Objekt mit +alloc erzeugt (und dann mit -init… initialisiert), sollte man selbst immer ein -autorelease hinterherschicken-

    Bei einem Convenience-Allocator (CA) wird dies alles automatisch gemacht.


    Original von franz
    Das Object wird also dem obersten "autorelease pool" auf dem Autorelasestack hinzugefügt.
    Das Object wird freigegeben, wenn zum pool eine "drain" oder eine "release" nachricht geschickt wird, ansonsten nicht?

    Ja

    Original von franz
    Wenn ein Object eine "autorelease" Nachricht erhällt dann wird doch der retain count auf ffff... gesetzt. Also bring mir ein release aufs Object nix?.

    Nein, der RC wird nicht auf den höchsten Wert gesetzt. Er wird überhaupt nicht verändert.
    Verändert wird die Verantwortung für die Freigabe vom Programmierer auf den ARP.

    Original von franz
    Ich habe aber auch gelesen, dass der pool einfach x-mal die "release" Nachricht zum Object schickt, halt so oft wie der retain count vom Object ist, aber da stimmt was nicht oder? der retain count ist doch auf ffff.. gesetzt?

    Doch, genau das stimmt. Der RC ist eben nicht auf dem Maximalwert.

    Original von franz
    Und noch hier zu(Code aus Doku.. von Apple):
    - (void)applicationDidFinishLaunching:(UIApplication *)application {

    // Create the window object and assign it to the
    // window instance variable of the application delegate.

    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    window.backgroundColor = [UIColor whiteColor];


    // Create a simple red square

    CGRect redFrame = CGRectMake(10, 10, 100, 100);
    UIView *redView = [[UIView alloc] initWithFrame:redFrame];
    redView.backgroundColor = [UIColor redColor];

    // Create a simple blue square
    CGRect blueFrame = CGRectMake(10, 150, 100, 100);
    UIView *blueView = [[UIView alloc] initWithFrame:blueFrame];
    blueView.backgroundColor = [UIColor blueColor];

    // Add the square views to the window

    [window addSubview:redView];
    [window addSubview:blueView];

    // Once added to the window, release the views to avoid the
    // extra retain count on each of them.

    [redView release]; //<----------------------------- release
    [blueView release]; //<----------------------------- release
    // Show the window.
    [window makeKeyAndVisible];

    }

    Die Views werden ja mit einem initWith initialisiert wieso noch ein release?

    Weil das -autorelease fehlt. Leider findest du vor allem in älteren Sourcenvon Apple anstelle eines Arbeiten mit -autorelease immer noch ein dezidiertes -release. Die Nachteile dieses Vorgehens bespreche ich.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Original von gritsch
    Original von karrade
    Warum eigentlich nicht den Garbage Collector nutzen? Sogar Xcode selber scheint mit GC kompiliert zu sein.


    weil man trotzdem verstehen sollte wie es funktioniert.

    Und es auf dem iPhone kein GC gibt.
    Ialea iacta est
  • Original von Diskordia
    Original von gritsch
    Original von karrade
    Warum eigentlich nicht den Garbage Collector nutzen? Sogar Xcode selber scheint mit GC kompiliert zu sein.


    weil man trotzdem verstehen sollte wie es funktioniert.

    Und es auf dem iPhone kein GC gibt.


    das wollt ich jetzt net sagen weil sich der thread nicht im iPhone-forum befindet