wake-up-neo.com

Aufruf von [self methodName] aus einem Block heraus?

Ich bin gerade auf Blöcke gestoßen und denke, dass sie genau das sind, wonach ich suche, abgesehen von einer Sache: Ist es möglich, eine Methode [self methodName] aus einem Block heraus aufzurufen?

Das versuche ich zu tun:

-(void)someFunction{
    Fader* fader = [[Fader alloc]init];

    void (^tempFunction)(void) = ^ {
        [self changeWindow:game]; 
        //changeWindow function is located in superclass
    };

    [fader setFunction:tempFunction];
}

Ich habe seit ein paar Tagen gesucht und kann keine Beweise dafür finden, dass dies möglich ist.

Ist das überhaupt möglich, oder versuche ich, Blöcke für etwas zu verwenden, für das sie nicht gedacht sind?

Der Grund, warum ich Blöcke verwende, ist, dass ich eine Fader-Klasse erstellt habe und einen Block speichern möchte, damit er ausgeführt wird, wenn das Ausblenden abgeschlossen ist.

Vielen Dank

EDIT: Okay, ich habe in dem Vorschlag hinzugefügt, aber ich erhalte immer noch einen EXC_BAD_ACCESS-Fehler ...

-(void)someFunction{
    Fader* fader = [[Fader alloc]init];

    __block MyScreen* me = self;

    void (^tempFunction)(void) = ^ {
        [me changeWindow:game]; 
        //changeWindow function is located in superclass
    };

    [fader setFunction:tempFunction];
    [fader release];
}

Vielleicht darf ich nicht Fader die Funktion geben ...?

72
Marty

Ja, das kannst du.

Beachten Sie jedoch, dass der Block self beibehält. Wenn Sie diesen Block in einem ivar speichern, können Sie leicht einen Retain-Zyklus erstellen, was bedeutet, dass keiner von beiden jemals freigegeben wird.

Um dies zu umgehen, können Sie Folgendes tun:

- (void) someMethodWithAParameter:(id)aParameter {

  __block MySelfType *blocksafeSelf = self;
  void (^tempFunction)(void) = ^ {
      [blocksafeSelf changeWindow:game];
  };

  [self doSomethingWithBlock:tempFunction];

}

Das __block Schlüsselwort bedeutet unter anderem, dass das referenzierte Objekt nicht beibehalten wird.

139
Dave DeLong

Die akzeptierte Antwort ist veraltet . Mit __block kann dann fehler verursachen!

Um dieses Problem zu vermeiden, wird empfohlen, einen weak - Verweis auf self wie folgt zu erfassen:

- (void)configureBlock {
    XYZBlockKeeper * __weak weakSelf = self;
    self.block = ^{
        [weakSelf doSomething];   // capture the weak reference
                                  // to avoid the reference cycle
    }
}

Weitere Informationen finden Sie unter Apple-Dokumentation - Vermeiden Sie starke Referenzzyklen beim Erfassen von Selbst .

22
skywinder
__block CURRENTViewController *blocksafeSelf = self;

[homeHelper setRestAsCheckIn:strRestId :^(NSObject *temp) {
    [blocksafeSelf YOURMETHOD:params];
}];
3
Ketan Patel

Ist es möglich, eine Methode [self methodName] aus einem Block heraus aufzurufen?

Ja, warum nicht. Wenn es sich bei Ihrem tempFunction um eine Instanzmethode handelt, können Sie dies tun. Die aufgerufene Methode sollte als einzige Einschränkung zugänglich sein.

1
Mahesh