Selector (SEL) in .h-Datei "für Dummies"

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

  • Selector (SEL) in .h-Datei "für Dummies"

    Guten Morgen,

    folgendes Szenario:
    Klasse A erstellt eine Instanz der Klasse B.
    Klasse B soll eine Methode der Klasse A ausführen sobald (zB) eine Schaltfläche auf dieser gedrückt wurde.

    Mein Ansatz war bisher folgender:

    Quellcode

    1. @interface KlasseB : NSObject { SEL m_selector;}@property SEL selectorX; @end

    entsprechend rufe ich in der Klasse A:
    "[m_InstanzVonB setSelectorX:@selector(FunktionVonKlasseA)]" auf.
    Wenn ich nun aber in der Klasse B "performSelector:@selector(m_selector)" aufrufe bekomme ich die bekannte Exception: "unrecognized selector....".

    Hat mir jemand etwas Quellcode wie ich diese Aufgabe lösen kann?

    Grüße,
    h0x45

    PS: @synthesize selectorX = m_selector;
  • In deinem "Code"-Schnippsel fehlt der Adressat der Nachricht. Schickt du das performSelector: wirklich an die Instanz der Klasse A? Oder nicht vielleicht doch aus Schusseligkeit an self?

    Ein paar Fragen hätte ich noch:
    Was ist eigentlich dieses komische "m_"?
    Und wieso baust du ein Accessorpaar, wenn du dann doch unmittelbar auf die INstanzvariable zugreifst?
    Meinst du, dass ein Zeilenumbruch die Ausführungszeit des Programmes erhöht?
    Willst du das ich Augenkrebs bekomme?

    +++

    Hatte A und B verwechselt. Da wären wir bei der nächsten Frage:
    Würde es nicht auch die Lesbarkeit von Beispielen erhöhen, wenn man Receiver und Sender als Bezeichnung verwendet?
    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:

    In deinem "Code"-Schnippsel fehlt der Adressat der Nachricht. Schickt du das performSelector: wirklich an die Instanz der Klasse B? Oder nicht vielleicht doch aus Schusseligkeit an self?

    Ein paar Fragen hätte ich noch:
    Was ist eigentlich dieses komische "m_"?
    Und wieso baust du ein Accessorpaar, wenn du dann doch unmittelbar auf die INstanzvariable zugreifst?
    Meinst du, dass ein Zeilenumbruch die Ausführungszeit des Programmes erhöht?
    Willst du das ich Augenkrebs bekomme?


    er kommt von C++ ;-))
  • Der Übersicht halber poste ich mal die abgespeckten Klassen:

    // KlasseA.h

    Quellcode

    1. #import "..."
    2. @class KlasseB;
    3. @interface KlasseA : NSObject {
    4. KlasseB* m_pKlasseB;
    5. }
    6. -(void)dummy:(NSString*)pString; // diese Methode soll von KlasseB aufgerufen werden
    7. @end


    //KlasseA.m

    Quellcode

    1. #import "KlasseA.h"
    2. #import "KlasseB.h"
    3. @implementation KlasseA
    4. -(id)init {
    5. self = [super init];
    6. if (self) {
    7. m_pKlasseB = [[KlasseB alloc] init];
    8. [m_pKlasseB setSelectorX:@selector(dummy:)];
    9. }
    10. }
    11. -(void)dummy:(NSString*)pString {
    12. NSLog(@"String: %@", pString);
    13. }
    14. -(void)dealloc {
    15. [m_pKlasseB release];
    16. [super dealloc];
    17. }
    18. @end
    Alles anzeigen


    // KlasseB.h

    Quellcode

    1. #import "..."
    2. @interface KlasseB : NSObject {
    3. SEL m_selector;
    4. }
    5. @property SEL selectorX;
    6. -(void)doSomething;
    7. @end


    // KlasseB.m

    Quellcode

    1. #import "KlasseB.h"
    2. @implementation KlasseB
    3. @synthesize selectorX = m_selector;
    4. -(id)init {
    5. ...
    6. }
    7. -(void)doSomething {
    8. [self performSelector:@selector(m_selector:) withObject:@"String"];
    9. }
    10. -(void)dealloc {
    11. [super dealloc];
    12. }
    13. @end
    Alles anzeigen



    @Amin: ich werde mir deine Tips zu Herzen nehmen.....ab dem nächsten Post
    @Gritsch: Der Verweis fehlt... habe gedacht der Selector würde ausreichen...
  • h0x45 schrieb:

    Der Übersicht halber poste ich mal die abgespeckten Klassen:

    // KlasseA.h

    Quellcode

    1. #import "..."
    2. @class KlasseB;
    3. @interface KlasseA : NSObject {
    4. KlasseB* m_pKlasseB;
    5. }
    6. -(void)dummy:(NSString*)pString; // diese Methode soll von KlasseB aufgerufen werden
    7. @end


    //KlasseA.m

    Quellcode

    1. #import "KlasseA.h"
    2. #import "KlasseB.h"
    3. @implementation KlasseA
    4. -(id)init {
    5. self = [super init];
    6. if (self) {
    7. m_pKlasseB = [[KlasseB alloc] init];
    8. [m_pKlasseB setSelectorX:@selector(dummy:)];
    9. }
    10. }
    11. -(void)dummy:(NSString*)pString {
    12. NSLog(@"String: %@", pString);
    13. }
    14. -(void)dealloc {
    15. [m_pKlasseB release];
    16. [super dealloc];
    17. }
    18. @end
    Alles anzeigen


    // KlasseB.h

    Quellcode

    1. #import "..."
    2. @interface KlasseB : NSObject {
    3. SEL m_selector;
    4. }
    5. @property SEL selectorX;
    6. -(void)doSomething;
    7. @end


    // KlasseB.m

    Quellcode

    1. #import "KlasseB.h"
    2. @implementation KlasseB
    3. @synthesize selectorX = m_selector;
    4. -(id)init {
    5. ...
    6. }
    7. -(void)doSomething {
    8. [self performSelector:@selector(m_selector:) withObject:@"String"];
    9. }
    10. -(void)dealloc {
    11. [super dealloc];
    12. }
    13. @end
    Alles anzeigen



    @Amin: ich werde mir deine Tips zu Herzen nehmen.....ab dem nächsten Post
    @Gritsch: Der Verweis fehlt... habe gedacht der Selector würde ausreichen...


    genau wie ich gedacht habe schickst du die message ja an self und nicht an die instanz der Klasse A (was du machen wolltest/müsstest)
  • gritsch schrieb:

    genau wie ich gedacht habe schickst du die message ja an self und nicht an die instanz der Klasse A (was du machen wolltest/müsstest)

    Erschwerend kommt noch hinzu, dass er nicht den Selector aus der Instanzvariable verschickt, sondern einfach @selector(m_selector: ). Korrekt müsste es so aussehen:

    Quellcode

    1. [classAInstance performSelector:self.selectorX withObject:@"String"];

    Michael