Annotation-Titel und Strings

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

  • Annotation-Titel und Strings

    Hallo,

    ich möchte in meiner Annotation einen Titel setzen. Das funktioniert auch:

    Quellcode

    1. [anno setTitle:@"Titel"];

    ebenso wie:

    Quellcode

    1. NSString *s = @"Titel";
    2. [anno setTitle: s];

    Wenn ich jetzt allerdings mir einen NSString zusammenschuster:

    Quellcode

    1. NSString *s1 = @"name";
    2. NSString *space = @" ";
    3. NSString *s2 = [s1 stringByAppendingString: space];
    4. NSString *title = @"title";
    5. NSString *s = [s2 stringByAppendingString: title];
    6. [anno setTitle:s];

    schmeißt mich die app raus, nachdem ich den Pin antippe.

    Weiß einer was ich da tun muss? ?(
  • probier es aus ...

    eine Lösung habe ich jetzt gefunden.

    Quellcode

    1. NSString *s1 = @"name";
    2. NSString *space = @" ";
    3. NSString *s2 = [s1 stringByAppendingString: space];
    4. NSString *title = @"title";
    5. NSString *s = [s2 stringByAppendingString: title];
    6. NSMutableString *ms = [[NSMutableString alloc] initWithString:s]
    7. [anno setTitle:ms];


    ich finds komisch aber die hauptsache ist, dass es funzt ;)

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

  • Gritsch hat aber recht.

    Es ist jetzt purer Zufall das es geht. Der Code der nicht lief ist auch in Ordnung. Es wird nur mit irgendeinem Timing zusammen hängen, dass in der jetzigen Version halt geht. Du hast ganz wo anders einen dicken Fehler drin. Ohne das Du uns sagst mit welches Fehlermeldung er rausfliegt kann man dazu natürlich nicht mehr sagen, aber ich nehme mal an es wird ein BAD_ACCESS sein.

    Du solltest den Fehler nicht durch pfuschen verschwinden lassen sondern froh sein das er reproduzierbar kommt und ihn sauber debuggen. Denn sonst wird Dein Programm irgendwann vollkommen unkontrolliert abstürzen und Du kriegst es nicht reproduziert.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Also mal ganz ernsthaft: MKAnnotaionist ein Protokoll.
    Die Speicherverwaltung ist also von der Klasse abhängig, die das Protokoll implementiert.

    Also muss die Klasse das immer selbst regeln, Properties, Konstanten etc, alles ist möglich.

    Ohne Implementierung knallt es, oder es gibt ein Speicherleck.
    I would be embarrassed if they did not spy on me.
  • orthmac schrieb:

    probier es aus ...

    eine Lösung habe ich jetzt gefunden.

    Quellcode

    1. NSString *s1 = @"name";
    2. NSString *space = @" ";
    3. NSString *s2 = [s1 stringByAppendingString: space];
    4. NSString *title = @"title";
    5. NSString *s = [s2 stringByAppendingString: title];
    6. NSMutableString *ms = [[NSMutableString alloc] initWithString:s]
    7. [anno setTitle:ms];


    ich finds komisch aber die hauptsache ist, dass es funzt ;)


    Wie schon einige vor mir geschrieben haben, der Fehler liegt wo anders. Deine "Lösung" verursacht ein Leak ( ms ) wenn nicht noch ein "release" folgt !
  • Ich denke genau das wird das Problem es sein. Er benutzt den Zeiger später noch einmal irgendwo. Und durch seinen Leak hat er ihn nun sicher. Auch eine Art.. Aber egal es scheint ihn eh nicht zu interessieren "richtig" zu programmieren, die Hauptsache es geht halt irgendwie. Da kann man dann auch nicht helfen

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Sorry Jungs, ich war im Urlaub, klar interessiert es mich vernünftig zu programmieren aber als Anfänger ist das manchmal schwer.

    ramo schrieb:

    [anno setTitle:[NSString stringWithFormat:@"%@%@%@", s1, space, title]];
    hab ich ausprobiert und es funktioniert auch nicht.
    Die Fehlermeldung ist: Thread 1: Program received signal: "EXC_BAD_ACCESS"
    Vielleicht hilft ja der Code der Annotation-Klasse
    .h

    Quellcode

    1. #import <MapKit/MapKit.h>
    2. @interface MyFirstAnnotation : NSObject <MKAnnotation>
    3. {
    4. CLLocationCoordinate2D coord;
    5. NSString *titel;
    6. NSString *untertitel;
    7. }
    8. @property(nonatomic,readwrite)CLLocationCoordinate2D coord;
    9. @property(nonatomic,assign)NSString *titel;
    10. @property(nonatomic,assign)NSString *untertitel;
    11. -(void)setCoordinate:(CLLocationCoordinate2D)coords;
    12. -(void)setTitle:(NSString *)title;
    13. -(void)setSubtitle:(NSString *)subtitle;
    14. @end
    Alles anzeigen

    .m

    Quellcode

    1. @implementation MyFirstAnnotation
    2. @synthesize coord;
    3. @synthesize titel;
    4. @synthesize untertitel;
    5. -(void)setCoordinate:(CLLocationCoordinate2D)coords
    6. {
    7. coord = coords;
    8. }
    9. -(void)setTitle:(NSString *)title
    10. {
    11. titel = title;
    12. }
    13. -(void)setSubtitle:(NSString *)subtitle
    14. {
    15. untertitel = subtitle;
    16. }
    17. -(CLLocationCoordinate2D)coordinate
    18. {
    19. return coord;
    20. }
    21. - (NSString *)title
    22. {
    23. return titel;
    24. }
    25. - (NSString *)subtitle
    26. {
    27. return untertitel;
    28. }
    29. @end
    Alles anzeigen
  • Du hast title und untertitle mit einem property deklariert und schreibst dann trotzdem eigenen setter und getter. Das ist schonmal nicht falsch aber auch nicht schön.

    Weiterhin ist es so, dass wenn Du ein

    NSString *string=[[NSString stringWithFormat:@"Fffsd"];

    machst, du nicht der Owner dieses String bist sondern dieser autoreleased wird.
    Wenn du den dann mit setTtile() auf dein title setzt, dann wirst Du immer noch nicht Owner. Sobald also die App dann zurück in die runloop kommt, wird der string vom system freigegeben (autorelease) und wenn du nun dein titel benutzt bekommst du den BAD_ACCESS.

    Um das zu verhindern muss du den string retainen. Das kannst du machen indem Du in Deinem Setter ein Retain dran hängst z.B. Du darfst dann aber auch nicht vergessen ihn wieder freizugeben (release) wenn Du ihn nicht mehr brauchst. Schöner macht man das ganze indem man mit einem retain property arbeitet. Du machst also einen

    @property (retain) NSString *title

    und schreibst gar keinen setter (also dieses setTitle) sondern nimmst den automatisch erzeugten und schreibst

    self.title=[[NSString stringWithFormat:@"fjdhfj"];

    und im dealloc Deiner Klasse dann ein

    self.title=nil;

    Lies Dir unbedingt die Apple Docs zum Memory-Management durch. Diese Grundlage must du verstanden haben, sonst wirst Du keine stabile App programmiert bekommen.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)

  • orthmac schrieb:

    Sorry Jungs, ich war im Urlaub, klar interessiert es mich vernünftig zu programmieren aber als Anfänger ist das manchmal schwer.

    ramo schrieb:

    [anno setTitle:[NSString stringWithFormat:@"%@%@%@", s1, space, title]];
    hab ich ausprobiert und es funktioniert auch nicht.
    Die Fehlermeldung ist: Thread 1: Program received signal: "EXC_BAD_ACCESS"
    Vielleicht hilft ja der Code der Annotation-Klasse
    .h

    Quellcode

    1. #import <MapKit/MapKit.h>
    2. @interface MyFirstAnnotation : NSObject <MKAnnotation>
    3. {
    4. CLLocationCoordinate2D coord;
    5. NSString *titel;
    6. NSString *untertitel;
    7. }
    8. @property(nonatomic,readwrite)CLLocationCoordinate2D coord;
    9. @property(nonatomic,assign)NSString *titel;
    10. @property(nonatomic,assign)NSString *untertitel;
    11. -(void)setCoordinate:(CLLocationCoordinate2D)coords;
    12. -(void)setTitle:(NSString *)title;
    13. -(void)setSubtitle:(NSString *)subtitle;
    14. @end
    Alles anzeigen

    .m

    Quellcode

    1. @implementation MyFirstAnnotation
    2. @synthesize coord;
    3. @synthesize titel;
    4. @synthesize untertitel;
    5. -(void)setCoordinate:(CLLocationCoordinate2D)coords
    6. {
    7. coord = coords;
    8. }
    9. -(void)setTitle:(NSString *)title
    10. {
    11. titel = title;
    12. }
    13. -(void)setSubtitle:(NSString *)subtitle
    14. {
    15. untertitel = subtitle;
    16. }
    17. -(CLLocationCoordinate2D)coordinate
    18. {
    19. return coord;
    20. }
    21. - (NSString *)title
    22. {
    23. return titel;
    24. }
    25. - (NSString *)subtitle
    26. {
    27. return untertitel;
    28. }
    29. @end
    Alles anzeigen


    Damit das alles wie vorgesehen klappt, musst Du noch

    Quellcode

    1. @synthesize title = titel;
    2. @synthesize subtitle = untertitel;

    formulieren.
    Sonst gehorcht Du dem Protokoll nicht. So gesehen war Deine Methode gar nicht so verkehrt.

    Ich hoffe, jetzt habe ich mich auch nicht vertippt.
    Besonders die erste Zeile ist anfällig, selbst wenn man ausländisch kann.
    I would be embarrassed if they did not spy on me.