Variablen immer nil

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

  • Variablen immer nil

    Hallo zusammen,

    bin ich zu blöd oder was übersehe ich:

    Quellcode

    1. - (id) init
    2. {
    3. self = [super init];
    4. if(self)
    5. {
    6. NSString *hi = @"Hallo";
    7. _deXMLMenuPath = [NSURL URLWithString:@"http://www.meineSeite.de/index.php?id=2324"];
    8. return self;
    9. }
    10. return nil;
    11. }
    Alles anzeigen


    Ich habe eine Klasse von NSObject abgeleitet und überschreibe die init Methode wie oben. Habe oben den string "hi" zum Test und der ist nil wenn ich mit dem Debugger durchgehe.
    Alle Variablen bleiben nil.. Warum? :O

    Self wird initialisiert hat auch einen Wert aber wenn ich dass dann mit alloc init aufrufe, bekomme ich nil.

    HÄÄ

    Edit:

    Sobald ich NSLog("%@", hi); dahinter schreibe, gibt er "hallo" aus und hat im Debugger plötzlich auch einen Wert. Sonst nicht.

    [Blockierte Grafik: http://abload.de/img/bildschirmfoto2015-015vurn.png]
    Every language has an optimization operator. In ObjC that operator is ‘//’.

    golbros.de
  • Hast Du irgendwelche Optimierungen beim Übersetzen an? Also, ist es ein echter Debug-Build oder nicht? Das kann die Ursache sein, dann hängen die Variablen in irgendwelchen Registern rum und der Debugger hat ein Problem. Oder beim Beispiel oben wird die Zeile "NSString *hi = @"Hallo";" wegoptimiert, weil nie darauf zugegriffen wird.

    ciao

    gandhi
  • gandhi schrieb:

    Hast Du irgendwelche Optimierungen beim Übersetzen an? Also, ist es ein echter Debug-Build oder nicht? Das kann die Ursache sein, dann hängen die Variablen in irgendwelchen Registern rum und der Debugger hat ein Problem. Oder beim Beispiel oben wird die Zeile "NSString *hi = @"Hallo";" wegoptimiert, weil nie darauf zugegriffen wird.

    ciao

    gandhi


    Wüsste nicht, dass ich sowas aktiviert habe. Wüsste auch nicht wo :O
    Every language has an optimization operator. In ObjC that operator is ‘//’.

    golbros.de
  • räumt ARC das weg , weil du die Variable nie benutzt ?
    ich hab das hin und wieder das im debugger auch merkwürdige sachen stehen,
    was gibt die console aus wenn du im breakpoint "po hi" eingibst ?

    etwas OT:

    anstatt id solltest du instancetype verwenden (nutzt Apple seit iOS8 auch überall)

    dein return in der if kannst du dir sparen und return self nach der if machen anstelle von nil
    entweder ist self halt self oder nil
    Ich weiß nicht immer wovon ich rede aber ich weiß das ich Recht habe. :saint:

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

  • Fortrackz schrieb:

    Wüsste auch nicht wo :O


    in den Build-Settings.

    ​räumt ARC das weg , weil du die Variable nie benutzt ?

    Das sicherlich auch, die Frage ist nur wann? Ohne weitere Optimierungen durch allerlei schlaue Compiler/und/oder ARC-Runtimes sollte es beim Verlassen des aktuellen Scopes über den Jordan gehen.
    Aber das ist keine "weak"-Referenz, d.h. der Pointer wird nicht ausgenullt, wenn das dazugehörige Objekt weggeräumt wird, kann also nicht das "nil" im Debugger erklären. Dazu braucht's noch ein paar Optimierungen

    ciao

    gandhi
  • Ich würde sagen "Halo" bzw. "HaloHallo". Der Debugger bzw. die Variablenanzeige ist in Xcode, wie der ganze Rest auch, etwas fehlerbehaftet. Darauf würde ich mich also nicht verlassen. po und NSLog sind momentan die bessere Wahl. Ist wohl zu schwer Objective-C und Swift gleichzeitig in einer IDE zu unterstützen.
    Das Herz besitzt Gründe, die die Vernunft nicht kennt.
  • Fortrackz schrieb:


    Sobald ich NSLog("%@", hi); dahinter schreibe, gibt er "hallo" aus und hat im Debugger plötzlich auch einen Wert. Sonst nicht.


    Genau für solche Fälle hat der liebe kmr auf der Macoun 2013 einen Vortrag über Assembler am Beispiel von Dead Store Elimination gehalten. Guck doch einfach in den Vortrag und/oder das Assembly. Dort wirst Du die Lösung finden.
  • kmr schrieb:

    Fortrackz schrieb:


    Sobald ich NSLog("%@", hi); dahinter schreibe, gibt er "hallo" aus und hat im Debugger plötzlich auch einen Wert. Sonst nicht.


    Genau für solche Fälle hat der liebe kmr auf der Macoun 2013 einen Vortrag über Assembler am Beispiel von Dead Store Elimination gehalten. Guck doch einfach in den Vortrag und/oder das Assembly. Dort wirst Du die Lösung finden.

    So etwas mehr Zeit:

    Glaube ich konkret nicht. DSE würde wohl eher hi wegoptimieren, was er im Debugmode nicht tun sollte und wohl auch nicht tut.

    Aber das Problem ist umfassender. So etwas kann auch passieren bei

    Quellcode

    1. {
    2. id hi = [irgendwie newIrgendwo:irgendwann];
    3. // tausend mal berührt, tausend mal ist nichts passiert
    4. }


    Hier kann der Call niemals wegoptimiert werden, weil der Compiler nicht weiß, ob es nicht einen Seiteneffekt gibt. Die lokale Variable kann er mit DSE wegoptimieren. Die Referenz bleibt aber bestehen und muss balanciert werden. Also muss ein release her. Stellt sich die Frage, wo das platziert wird. Mit genauer Lebenszeit darf es erst am Ende des Blockes stehen, ohne auch davor.

    Ist doch alles kein Problem? Doch ist es: Wenn etwa innerhalb der Methode eine nicht-starke Referenz behalten wird, ist nicht vorhersehbar, wann die auf nil gesetzt wird (weak) oder ein Dangling-Pointer besteht (unsafe unretained).

    Heißt übrigens richtig precise lifetime semantics und die Option objc_precise_lifetime

    clang.llvm.org/docs/AutomaticR…recise-lifetime-semantics
    By default, local variables of automatic storage duration do not have precise lifetime semantics. Such objects are simply strong references which hold values of retainable object pointer type, and these values are still fully subject to the optimizations on values under local control.


    Es existiert die Möglichkeit, das auch für die Variable konkret auszuschalten mit dem Attribut objc_precise_lifetime. Kannst du ja mal probieren.
    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"?
  • Lösung war dann doch relativ einfach:

    Das Scheme war auf "Release" eingestellt. Warum weiß ich nicht. Deswegen waren im Debugger natürlich die Variablen nil.

    Der Grund warum aber letztendlich mein initWithContentsOfFile nicht funktioniert hat (Nach Error ausgabe Cocoa Error 256), war dass der Simulator (oder Xcode) keine Internetverbindung hatte.
    Warum? Keine Ahnung. Neugestartet und dann liefs.

    Selbe Problem heute wieder. Macbook aus Ruhezustand geholt. App gestartet -> Cocoa Error 256. Simulator und Xcode neugestartet. Voilà funktioniert.

    Danke an @Amin Negm-Awad, deine Posts sind immer hilfreich und interessant!
    Every language has an optimization operator. In ObjC that operator is ‘//’.

    golbros.de
  • Fortrackz schrieb:

    Lösung war dann doch relativ einfach:

    Das Scheme war auf "Release" eingestellt. Warum weiß ich nicht. Deswegen waren im Debugger natürlich die Variablen nil.

    Der Grund warum aber letztendlich mein initWithContentsOfFile nicht funktioniert hat (Nach Error ausgabe Cocoa Error 256), war dass der Simulator (oder Xcode) keine Internetverbindung hatte.
    Warum? Keine Ahnung. Neugestartet und dann liefs.

    Selbe Problem heute wieder. Macbook aus Ruhezustand geholt. App gestartet -> Cocoa Error 256. Simulator und Xcode neugestartet. Voilà funktioniert.

    Danke an @Amin Negm-Awad, deine Posts sind immer hilfreich und interessant!

    Na, ja, es war kein Problem, weshalb das auch keine Lösung ist. Aber das Wundern ist damit natürlich erklärbar.
    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"?
  • kmr schrieb:

    Amin Negm-Awad schrieb:

    Glaube ich konkret nicht. DSE würde wohl eher hi wegoptimieren, was er im Debugmode nicht tun sollte und wohl auch nicht tut.


    DSE war auch nur der Pointer auf den Vortrag und sollte nicht die Lösung sein. Die wichtige Information war die, ins Assembly zu gucken.

    Ein Pointer auf einen Macoun-Vortrag sollte ohnehin immer mit einem Thumbs-Up bedient werden.

    Allerdings würde ich sagen, dass der Blick in die Doku hier sogar noch besser war. Aber ich sehe ein, dass niemand wirklich Lust hat, sich die ARC-Doku von clang durchzulesen. Auch wenn sie prächtig ist.
    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"?
  • Amin Negm-Awad schrieb:


    Allerdings würde ich sagen, dass der Blick in die Doku hier sogar noch besser war. Aber ich sehe ein, dass niemand wirklich Lust hat, sich die ARC-Doku von clang durchzulesen. Auch wenn sie prächtig ist.


    Zusammenfassend lässt sich überdies festhalten: mit Swift wäre das nicht passiert. :evil:
  • Das ist richtig, weil die Speicherverwaltung bei Swift

    a) voller Bugs steckt,
    b) nicht dokumentiert ist und
    c) sich ohnehin von Release zu Release grundlegend ändert.

    Aber dafür weiß sie, dass wenn sie ein Instanzobjekt freigibt, von welchem Typen es ist. Keine Ahnung, wozu man das braucht.
    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"?
  • Amin Negm-Awad schrieb:

    Aber dafür weiß sie, dass wenn sie ein Instanzobjekt freigibt, von welchem Typen es ist. Keine Ahnung, wozu man das braucht.

    +roflmao+

    Oder, um dem Ruf eines deutschsprachigen Forums gerecht zu werden:
    +MAaüdBr+
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P