Gnadenloser Absturz eigener Klasse

  • Gnadenloser Absturz eigener Klasse

    Hallo,

    ich habe eine eigene Klasse kreiert ("myView"), die über einen Button in Hauptprogramm was machen sollte. Ich hatte aber immer Abstürze, so dass ich alle Funktionalität rausgenommen habe, bis nur noch -init und -dealloc. Trotzdem Stürzt das Proggi ab, obwohl gar nichts passiert, sobald ich den Knopf drücke.
    Das heißt ja, an meinem Grundkonzept stimmt was nicht, aber ich kann es nicht sehen.
    Ich habe mal den Code mitgeschickt:

    MyView.h

    Quellcode

    1. #import <Cocoa/Cocoa.h>
    2. @interface MyView : NSObject {
    3. }
    4. -(id) init;
    5. -(void) dealloc;
    6. @end

    MyView.m

    Quellcode

    1. #import "MyView.h"
    2. @implementation MyView
    3. -(id)init {
    4. self = [super init];
    5. return self;
    6. }
    7. -(void) dealloc{
    8. [self release];
    9. [super dealloc];
    10. }
    11. @end
    Alles anzeigen

    myObjekt.m

    Quellcode

    1. #import "myObjekt.h"
    2. #import "MyView.h"
    3. @implementation myObjekt
    4. - (IBAction)start:(id)sender
    5. {
    6. aView = [[MyView alloc]init];
    7. [aView release];
    8. }
    9. @end
    Alles anzeigen

    myObjekt.h

    Quellcode

    1. #import <Cocoa/Cocoa.h>
    2. @class MyView;
    3. @interface myObjekt : NSObject
    4. {
    5. IBOutlet NSTextField *output;
    6. MyView * aView;
    7. }
    8. - (IBAction)start:(id)sender;
    9. @end

    Ich sehe einfach nicht, was falsch läuft, aber sobald ich den Knopf "button" drücke, geht der Debugger auf und nach einer Weile versucht er > 80000 Stack-Seiten zu laden???

    Wenn mir hier jemand helfen könnte, wäre ich sehr dankbar!!

    fiveyears
  • Nimm im dealloc mal das [self release] raus.
    Oder lies Dir nochmal einen der hier immer wieder verlinkten Artikel zum Thema Speicherverwaltung durch.
    if (!exit(-1)) fprintf(stderr, "exit call failed. Program will continue\n");
  • Besten Dank für die Antwort, habe auch den Artikel gelesen, verstehe es aber nicht ganz.
    In einem Beispiel waren die Zeilen einer Klasse (NSWindowController)

    Quellcode

    1. - (id) init {
    2. self = [super initWithWindowNibName:@"Infofenster"];
    3. return self;
    4. }
    5. - (void) dealloc {
    6. [self release];
    7. ...
    8. [super dealloc];
    9. }

    also das gleiche init/release-Paar ohne Absturz??

    geht übrigens dann die Zeile

    Quellcode

    1. self = [[super init]autorelease];


    Danke nochmal

    fiveyears
  • Ich glaube nicht, dass ich in meinem Artikel ein [self release] habe, weder im -dealloc noch sonstwo.

    Es ist klar, dass du am Anfang das noch nicht wirklich blickst. Dann halte dich bitte sklavisch an die How-Tos. Da steht gewiss kein [self release] im -dealloc.

    [[super init] autorelease] ist übrigens übelst. Bitte halte dich sklavisch an die How-Tos.

    +++
    Du hast dir da eine Rekursion ohne Ausgang gebaut. Deshalb der Riesenstack.
    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 fiveyears
    das [self release] ist aus aus einem MacOS X-Programmierbuch (Bsp Bodymassindex)!!

    Ohne das Buch zu kennen: das ist echt riesengroßer Blödsinn.

    Halt Dich lieber an das, was wir Dir hier sagen. :D
    Und lies in der Wiki, da haben viele schlaue Leute viele schlaue Sachen geschrieben.
    if (!exit(-1)) fprintf(stderr, "exit call failed. Program will continue\n");
  • Original von fiveyears
    das [self release] ist aus aus einem MacOS X-Programmierbuch (Bsp Bodymassindex)!!

    Und das [self release] steht da wirklich in einer -dealloc Methode? Wenn ja, ist das ein riesen Fehler. Die -release Methode ruft nämlich die -dealloc Methode auf. Wenn man da nun wieder -release aufruft, hat man eine Endlosschleife und dann macht's irgendwann zwangsweise bumm.
    Selbst ein [self release] an einer anderen Stelle ist irgendwie sinnfrei.

    Michael
  • Ich gehe einfach mal davon aus, dass es aus dem Buch "Programmieren unter Mac OS X" von Marc Buchser stammt (BodyMassIndex wurde dort berechnet). Habe dem Buch auch unter Amazon volle Punktzahl gegeben, was ich mittlerweile bereue. 2-3 sind angemessen.
    Man muss dann aber dazu sagen, dass dies kein Objective-C und kein Cocoa Buch ist, vielmehr ein Rundumblick in Carbon, Cocoa und Java, nichts richtiges und nichts halbes.
    Also Klausel war es dann sicherlich nicht.
    There are 10 kinds of people in the world - those who understand binary
    and those who don't.
  • Original von macfreakz
    Leider heisst er nicht Klausel ...


    Nein er Heißt Marc Buchser "Programmieren unter Mac OS X" im
    Klausels Buch habe ich bis zur Seite 200 noch kein
    [self release] gefunden, wohlaber einen Vorschlag für
    kryptische Programmierung die dann
    aber nicht angewendet werden kann.
    Es wird z.b vorgeschlagen für die Klasse Instrument
    die Interface- und Implementierungsdatei "Implemntierung.h und
    Implementierung.m" zu verwenden.

    cu
    Josef
  • Hehehehe, das ist bestimmt nicht richtig redigiert worden. Mal schnell "Implementierung" gedacht.

    Klar, solche Fehler passieren ständig. [self release] *scheint* mir dann aber doch eher ein Denkfehler zu sein.
    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"?