[Grundlagen] Exception beim Start

  • [Grundlagen] Exception beim Start

    Hallo,

    ich versuche gerade mich in Obj-C einzuarbeiten und habe mir als Spielfeld eine Menübar App ausgesucht.

    Der Code ist folgender:
    Header

    Quellcode

    1. #import
    2. @interface Controller : NSObject {
    3. bool playing;
    4. NSStatusBar *bar;
    5. NSStatusItem *playPause;
    6. }
    7. - (id) init;@end

    Source

    Quellcode

    1. #import "Controller.h"
    2. @implementation Controller
    3. - (id) init {
    4. [super init];
    5. playing = FALSE;
    6. bar = [NSStatusBar systemStatusBar];
    7. playPause = [bar statusItemWithLength:NSVariableStatusItemLength];
    8. [playPause setTitle:@"Play"];
    9. return self;
    10. }
    11. int main (int argsc, char **argv) {
    12. Controller *ctrl = [[Controller alloc] init];
    13. [ctrl release];
    14. }@end
    Alles anzeigen




    Das Problem ist nun folgendes: Sobald ich starte, läuft der Build-Prozess durch, aber das Programm crasht an dieser Stelle:

    Quellcode

    1. playPause = [bar statusItemWithLength:NSVariableStatusItemLength];

    und zwar mit dieser Meldung:

    Quellcode

    1. Sun Jul 11 11:31:31 myPC XController[91446] : kCGErrorInvalidConnection: CGSSetWindowTags: Invalid connectionSun Jul 11 11:31:31 myPC XController[91446] : kCGErrorFailure: Set a breakpoint @ CGErrorBreakpoint() to catch errors as they are logged.Sun Jul 11 11:31:31 myPC XController[91446] : kCGErrorInvalidConnection: CGSSetDeferOrdering: error setting or clearing window tags2010-07-11 11:31:31.032 XController[91446:a0f] _NXCreateWindow: error setting window property (1002)Sun Jul 11 11:31:31 myPC XController[91446] : kCGErrorInvalidConnection: CGSSetWindowEventMask: Invalid connection...Sun Jul 11 11:31:31 myPC XController[91446] : kCGErrorInvalidConnection: CGSGetActiveMenuBarDrawingStyle: Invalid connection2010-07-11 11:31:31.205 XController[91446:a0f] CGSGetActiveMenuBarDrawingStyle((CGSConnectionID)[NSApp contextID], &sCachedMenuBarDrawingStyle) returned error 1002 on line 41 in _NSStatusBarGetCachedMenuBarDrawingStyleSun Jul 11 11:31:31 myPC XController[91446] : kCGErrorInvalidConnection: CGSDisableUpdateForConnections: Invalid connection2010-07-11 11:31:31.377 XController[91446:a0f] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'CGSDisableUpdate returned error 1002d'*** Call stack at first throw:( 0 CoreFoundation 0x00007fff86377cc4 __exceptionPreprocess + 180 1 libobjc.A.dylib 0x00007fff83ab40f3 objc_exception_throw + 45 2 CoreFoundation 0x00007fff86377ae7 +[NSException raise:format:arguments:] + 103 3 CoreFoundation 0x00007fff86377a74 +[NSException raise:format:] + 148 4 AppKit 0x00007fff84b743b4 -[NSStatusItem _adjustLength] + 386 5 XController 0x0000000100000cdc -[Controller init] + 228 6 XController 0x0000000100000d91 main + 65 7 XController 0x0000000100000bf0 start + 52 8 ??? 0x0000000000000001 0x0 + 1)terminate called after throwing an instance of 'NSException'Program received signal: “SIGABRT”.


    Weiß einer woran das liegen könnte? Mir fällt zumindestens nichts offensichtliches im Moment auf, vielleicht könnt hier helfen ^^

    Gruß

    PS: GC ist aktiviert
  • also wenn du gerade erst mit objectice C anfängst lohnt es sich natürlich, sich tutorials dazu anzuschaun. außerdem würde ich z.B. auf die grundgerüste in xcode aufbauen, da musst du z.b. keine eigene main methode schreiben, es wird ein appDelegate und ein main window für dich kreiert etc.

    zudem fällt mir spontan auf, dass du [super init]; aufrufst aber mit der zurückgegeben instanz nichts machst, richtig wäre
    self = [super init];
    zudem scheint mir NSStatusBar keine setTitle: methode zu haben.

    mein tip:
    developer.apple.com/mac/librar…ction/01Introduction.html
    hier anfangen!
  • Sorry, aber das ist kompletter murks.

    Woher hast Du das mit der eigenen main Funktion?
    Xcode 4 sucks – „,Multiple exclamation marks‘, he went on, shaking his head, are a sure sign of a diseased mind.‘“ (Terry Pratchett 1992: Eric)

    "Wir ordnen und befehlen hiermit allen Ernstes, dass die Advocati wollene schwarze Mäntel, welche bis unter das Knie gehen, unserer Verordnung gemäß zu tragen haben, damit man die Spitzbuben schon von weitem erkennt." (Friedrich Wilhelm I., Soldatenkönig)
  • Hey Ho,

    danke für die Antworten, ich glaube ich muss hier kurz was klarstellen:

    Ich habe mit Absicht keine Standardvorlage von Xcode genommen sondern mit einem leeren Projekt angefangen, damit ich auch die Interna besser verstehe.

    autoreleasepool: so wie ich das verstanden habe, brauche ich bei eingeschaltetem Garbage Collector (GC) mich damit nicht zu beschäftigen
    runloop: es soll ein menuitem ähnlich z.b. der uhrzeit in der menubar angezeigt werden, muss ich dafür das programm wirklich in einer loop laufen lassen?
    [super init]: das steht so im hillegras drinne und macht ja auch sinn, da man den "konstruktor" vom parent des aktuellen objektes aufruft, eine referenz zum jetzigen objekt ist also herstellbar
    setTitle: ist eine methode von NSStatusBarItem, was ich durch die NSStatusBar mir geben lasse

    Nochmals kurz hinterher: ich will keine anwendung mit einem window, es sollte ja auch möglich sein so etwas von hand zu erstellen

    PS: Ich habe etwas einführendes gelesen und auch erfahrungen mit einigen programmiersprachen, wenn du also helfen willst, dann tu das, ansonsten >><((((°>

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von xxlbug ()

  • xxlbug schrieb:

    Hey Ho,

    danke für die Antworten, ich glaube ich muss hier kurz was klarstellen:

    Ich habe mit Absicht keine Standardvorlage von Xcode genommen sondern mit einem leeren Projekt angefangen, damit ich auch die Interna besser verstehe.

    autoreleasepool: so wie ich das verstanden habe, brauche ich bei eingeschaltetem Garbage Collector (GC) mich damit nicht zu beschäftigen
    runloop: es soll ein menuitem ähnlich z.b. der uhrzeit in der menubar angezeigt werden, muss ich dafür das programm wirklich in einer loop laufen lassen?
    [super init]: das steht so im hillegras drinne und macht ja auch sinn, da man den "konstruktor" vom parent des aktuellen objektes aufruft, eine referenz zum jetzigen objekt ist also herstellbar
    setTitle: ist eine methode von NSStatusBarItem, was ich durch die NSStatusBar mir geben lasse

    Nochmals kurz hinterher: ich will keine anwendung mit einem window, es sollte ja auch möglich sein so etwas von hand zu erstellen

    also:
    runloop brauchst du meines wissens nach immer, ohne main runloop macht deine app nämlich nichts, denke ich mal
    super init funktioniert so nicht. das wäre das gleiche wie
    [path isDirectory]; ... da bekommst du einen bool zurück, aber solang du mit dem nichts machst nützt dir das einfach nichts. richtig ist
    self = [super init];
    da super init dir eine instanz der superklasse zurückgibt

    setTitle: kann sein, hab mir das nicht so genau angeschaut :D

    ganz abgesehen davon würd ich mich erstmal mit objective C beschäftigen, bevor ich mich mit den "internas" beschäftige (die du eigentlich so gut wie nie brauchst)
  • xxlbug schrieb:

    Ich habe mit Absicht keine Standardvorlage von Xcode genommen sondern mit einem leeren Projekt angefangen, damit ich auch die Interna besser verstehe.

    Nimm lieber den umgekehrten Weg mit einem fertigen Projekttemplate und versuche Schritt für Schritt zu verstehen, wie es funktioniert. Keine Angst, die fertigen Templates enthalten keinen magischen Code, der nicht nachvollziehbar ist.

    xxlbug schrieb:

    PS: Ich habe etwas einführendes gelesen und auch erfahrungen mit einigen programmiersprachen, wenn du also helfen willst, dann tu das, ansonsten >><((((°>

    1. Stand in Deiner einführenden Literatur nicht, wie Initializer geschrieben werden?
    2. Objective-C unterscheidet sich in vielen Punkten von anderen objekt-orientierten Sprachen.
    3. Wer hilft Dir denn hier nicht?
    4. Dieses ansonsten mit den vielen Satzzeichen dahinter, ist kein schöner Stil. Es hat sich in der Vergangenheit gezeigt, dass Leute die so versuchen hier einzusteigen, es sich in der Regel sehr schwer machen.
    „Meine Komplikation hatte eine Komplikation.“
  • danke für die hilfreichen Kommentare, leider bin ich nicht wirklich weiter.

    Mein Ziel ist es, einen einfachen iTunes Controller für die Menübar zu haben. Dafür brauche ich ja kein explizites UI sondern will nur die MenuBar mitbenutzen.

    Deshalb benutze ich auch kein Standard-UI Projekt von Xcode und kann deshalb nicht diesen Startup Mechanismus ausnutzen (ich meine sowas: applicationDidFinishLaunching).

    Ich schaue mir das jetzt mal mit der Runloop an, vielen dank dafür.

    Aber sollte das Programm ohne Runloop nicht wenigstens einmal kurz durchlaufen und etwas in der MenuBar anzeigen oder erfordert OSX bei grafischen Bausteinen immer eine Runloop?

    Nun zu OT:
    Meine Einführungsliteratur ist das Cocoa Programming von Hillegrass, was konkret ist denn an dieser Initalisierung falsch (außer der Runloop)?
    Dein Kommentar war "...und natürlich Grundlagen. Lies bitte etwas Einführendes.", das nenn ich nicht Hilfreich und grenzt schon ein bisschen an trollen, deswegen auch der Trollfisch (das sind nicht die typischen 1337-Zeichen ;-).

    Vielleicht versteh ich das nur falsch oder du hast vielleicht das ganze nicht so böse gemeint, lass uns das einfach mal vergessen ^^
    Gruß
  • xxlbug schrieb:

    Mein Ziel ist es, einen einfachen iTunes Controller für die Menübar zu haben. Dafür brauche ich ja kein explizites UI sondern will nur die MenuBar mitbenutzen.
    Schön und wer initialisiert die 'MenuBar' bei Dir?
    Xcode 4 sucks – „,Multiple exclamation marks‘, he went on, shaking his head, are a sure sign of a diseased mind.‘“ (Terry Pratchett 1992: Eric)

    "Wir ordnen und befehlen hiermit allen Ernstes, dass die Advocati wollene schwarze Mäntel, welche bis unter das Knie gehen, unserer Verordnung gemäß zu tragen haben, damit man die Spitzbuben schon von weitem erkennt." (Friedrich Wilhelm I., Soldatenkönig)
  • mika schrieb:

    xxlbug schrieb:

    Mein Ziel ist es, einen einfachen iTunes Controller für die Menübar zu haben. Dafür brauche ich ja kein explizites UI sondern will nur die MenuBar mitbenutzen.
    Schön und wer initialisiert die 'MenuBar' bei Dir?
    damit meine ich die Status Bar, Menu Bar oder wie auch immer die wirklich heißt, wo z.B. die Uhr oder das Bluetooth Widget von OSX drinne ist.

    Bekommen tu ich die über:

    Quellcode

    1. bar = [NSStatusBar systemStatusBar];
  • xxlbug schrieb:

    Ich habe mit Absicht keine Standardvorlage von Xcode genommen sondern mit einem leeren Projekt angefangen, damit ich auch die Interna besser verstehe.

    Ich bin nun wirklich nicht der Crack aber ehrlich: Das ist der komplett falsche Weg. Als jemand, der auch eine App als Helper geschrieben hat, die sich in die "MenuBar" mit einem Icon einklinkt, hier mein Vorschlag für Dein weiteres Vorgehen
    1. Wirf Dein altes Projekt in die Tonne.
    2. Starte in Xcode neu mit einem Template (z. B. "Cocoa Application").
    3. Schau Dir die Doku zum Interface Builder an, speziell wie man Menüs baut.
    4. Schau Dir die IBActions usw. an.
    5. Schau Dir in der Doku Folgendes an:

      Quellcode

      1. [[[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength] retain]

    6. Ändere Deinen Ton (und Deine Einstellung) von
      [quote]wenn du also helfen willst, dann tu das[/quote]
      zu: "Ich wäre Euch dankbar, wenn Ihr Euch Eure wertvolle Zeit nähmt und mir helfen könntet." Glaub nicht, dass hier alle darauf warten, Dir zu helfen und das auch noch als besonders große Ehre empfinden.


    Dann klappts auch.

    Viel Spaß