Fehlermeldung in der Konsole

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

Aufgrund der Corona-Krise: Die Veröffentlichung von Stellenangeboten und -gesuchen ist bis 31.3.2023 kostenfrei. Das beinhaltet auch Angebote und Gesuche von und für Freischaffende und Selbstständige.

  • Fehlermeldung in der Konsole

    Hallo, Bei einem Übungsprojekt "Pirate Adventure" (aus einer Tutorialreihe) kommt es zu folgendem Fehler. Ich würde versuchen ihn selber zu finden und zu beheben, aber dafür muss ich verstehen, was da schief läuft.

    Quellcode

    1. 2015-01-27 16:56:20.257 Pirate Adventure[658:365050] -[tile setWeapon:]: unrecognized selector sent to instance 0x7fd9a9509660
    2. 2015-01-27 16:56:20.259 Pirate Adventure[658:365050] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[tile setWeapon:]: unrecognized selector sent to instance 0x7fd9a9509660'
    3. *** First throw call stack:
    4. (
    5. 0 CoreFoundation 0x0000000105401f35 __exceptionPreprocess + 165
    6. 1 libobjc.A.dylib 0x000000010509abb7 objc_exception_throw + 45
    7. 2 CoreFoundation 0x000000010540904d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
    8. 3 CoreFoundation 0x000000010536127c ___forwarding___ + 988
    9. 4 CoreFoundation 0x0000000105360e18 _CF_forwarding_prep_0 + 120
    10. 5 Pirate Adventure 0x0000000104b63b57 -[Factory tiles] + 327
    11. 6 Pirate Adventure 0x0000000104b647c5 -[ViewController viewDidLoad] + 133
    12. 7 UIKit 0x0000000105913a90 -[UIViewController loadViewIfRequired] + 738
    13. 8 UIKit 0x0000000105913c8e -[UIViewController view] + 27
    14. 9 UIKit 0x0000000105832ca9 -[UIWindow addRootViewControllerViewIfPossible] + 58
    15. 10 UIKit 0x0000000105833041 -[UIWindow _setHidden:forced:] + 247
    16. 11 UIKit 0x000000010583f72c -[UIWindow makeKeyAndVisible] + 42
    17. 12 UIKit 0x00000001057ea061 -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 2628
    18. 13 UIKit 0x00000001057ecd2c -[UIApplication _runWithMainScene:transitionContext:completion:] + 1350
    19. 14 UIKit 0x00000001057ebbf2 -[UIApplication workspaceDidEndTransaction:] + 179
    20. 15 FrontBoardServices 0x0000000107faa2a3 __31-[FBSSerialQueue performAsync:]_block_invoke + 16
    21. 16 CoreFoundation 0x000000010533753c __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12
    22. 17 CoreFoundation 0x000000010532d285 __CFRunLoopDoBlocks + 341
    23. 18 CoreFoundation 0x000000010532d045 __CFRunLoopRun + 2389
    24. 19 CoreFoundation 0x000000010532c486 CFRunLoopRunSpecific + 470
    25. 20 UIKit 0x00000001057eb669 -[UIApplication _run] + 413
    26. 21 UIKit 0x00000001057ee420 UIApplicationMain + 1282
    27. 22 Pirate Adventure 0x0000000104b67233 main + 115
    28. 23 libdyld.dylib 0x0000000107991145 start + 1
    29. )
    30. libc++abi.dylib: terminating with uncaught exception of type NSException
    31. (lldb)
    Alles anzeigen


    Das steht bei mir in der Konsole.. Was bedeutet das? :/ In dem Projekt sind keine roten oder gelben Meldungen, aber die App stürzt direkt ab. Ich habe es schon mit Breakpoints versucht, und konnte auch feststellen in welcher Zeile das liegt, aber ich habe nicht verstanden was da falsch ist! Ich nutze Xcode 6 für IOS 8.

    Danke :)
  • Okay, danke schonmal.

    So ähnlich habe ich das auch schon verstanden. Aber ich kann nicht erkennen warum das so ist.

    Ich habe ein @property erstellt:

    tile.h:

    Quellcode

    1. ​@property (nonatomic, strong) Weapon *weapon;


    und dann einfach die SetterMethode (mit dot Notation) genutzt.

    Klasse.m

    Quellcode

    1. ​ Weapon *sword = [[Weapon alloc] init];
    2. sword.name = @"Sword";
    3. sword.damage = 12;
    4. tile1.weapon = sword; // ist dann vermutlich diese Zeile
  • gritsch schrieb:

    übrigens: einfach exception breakpoint setzen und Xcode zeigt dir genau den stacktrace an wo das problem auftritt.


    Ja, er zeigt mir genau die Zeile

    Quellcode

    1. ​tile1.weapon = sword;


    Hier:

    tile.h

    Quellcode

    1. ​#import <Foundation/Foundation.h>
    2. #import <UIKit/UIKit.h>
    3. #import "Weapon.h"
    4. #import "Armor.h"
    5. @interface tile : NSObject
    6. @property (nonatomic, strong) NSString *story;
    7. @property (nonatomic, strong) UIImage *background;
    8. @property (nonatomic, strong) NSString *actionButtonName;
    9. @property (nonatomic, strong) Weapon *weapon;
    10. @property (nonatomic, strong) Armor *armor;
    11. @property (nonatomic) int healthEffect;
    12. @end
    Alles anzeigen
  • und da wo du tile1.weapon machst hast du auch tile.h importiert?

    btw.
    #import "Armor.h"
    kannst du in der.h auch durch @class Armor; ersetzen,das import kann dann in die .m
    an der Stelle brauchst du die Klasse Amor noch nicht, mit der @class sagst du dem compiler das es die Klasse gibt sie ihn an der Stelle aber nicht zu interessieren braucht und in der .m gibst du ihm sie dann mit dem import
    Ich weiß nicht immer wovon ich rede aber ich weiß das ich Recht habe. :saint:
  • nussratte schrieb:

    und da wo du tile1.weapon machst hast du auch tile.h importiert?

    btw.
    #import "Armor.h"
    kannst du in der.h auch durch @class Armor; ersetzen,das import kann dann in die .m
    an der Stelle brauchst du die Klasse Amor noch nicht, mit der @class sagst du dem compiler das es die Klasse gibt sie ihn an der Stelle aber nicht zu interessieren braucht und in der .m gibst du ihm sie dann mit dem import


    Ich habe in der Factory.h tile.h importiert. Aber in der Factory.m dann natürlich Factory.h, also ist es ja das gleiche. außerdem würde dann doch eine rote Meldung kommen, oder nicht?

    Macht es denn einen Unterschied, wenn ich es mit @class mache?

    gritsch schrieb:

    verwendest du einen alten compiler, denn dann fehlt womöglich das synthesize.


    Vermute nicht, ich habe den Computer und damit Xcode erst seit ende Dezember, also sollte alles noch recht aktuell sein.
  • gritsch schrieb:

    dann überprüfe doch mal ob wirklich deine klasse verwendet wird und nicht sonst irgend eine klasse die zufällig den gelichen namen hat ;)

    edit: zur laufzeit überprüfen meine ich natürlich!


    Ok das wars. In Zukunft nutze ich einen Präfix für meine Klassen. Es gab bereits eine Klasse mit dem Namen tile und ich habe meine zum Test TTile genannt und jetzt läuft alles.

    Danke für eure Hilfe
  • asteiger schrieb:

    gritsch schrieb:

    dann überprüfe doch mal ob wirklich deine klasse verwendet wird und nicht sonst irgend eine klasse die zufällig den gelichen namen hat ;)

    edit: zur laufzeit überprüfen meine ich natürlich!


    Ok das wars. In Zukunft nutze ich einen Präfix für meine Klassen. Es gab bereits eine Klasse mit dem Namen tile und ich habe meine zum Test TTile genannt und jetzt läuft alles.

    Danke für eure Hilfe


    meist gibt es auch noch einen sinnvollen namen. denn tiles gibt es ja in vielen zusammenhängen.