Вызов [self methodName] изнутри блока?

Я только что столкнулся с блоками, и я думаю, что они именно то, что я ищу, за исключением одного: можно ли вызвать метод [self methodName] изнутри блока?

Это то, что я пытаюсь сделать:

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

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

    [fader setFunction:tempFunction];
}

Я искал пару дней, и я не могу найти никаких доказательств того, что это возможно.

Возможно ли это, или я пытаюсь использовать блоки для чего-то, для чего они не предназначены?

Причина, по которой я использую блоки, заключается в том, что я создал класс Fader, и я хочу сохранить блок для его выполнения, когда он заканчивает затухание.

Спасибо

EDIT: Хорошо, я добавил в предложение, но я все еще получаю ошибку EXC_BAD_ACCESS...

-(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];
}

Возможно, мне не разрешено давать фейдеру функцию...?

Ответ 1

Да, вы можете это сделать.

Обратите внимание, однако, что блок сохранит self. Если вы сохраните этот блок в ivar, вы можете легко создать цикл сохранения, а это значит, что ни один из них не будет освобожден.

Чтобы обойти это, вы можете сделать:

- (void) someMethodWithAParameter:(id)aParameter {

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

  [self doSomethingWithBlock:tempFunction];

}

Ключевое слово __block означает (между прочим), что ссылочный объект не будет сохранен.

Ответ 2

Принятый ответ устаревший. Использование __block в этом случае может привести к ошибкам!

Чтобы избежать этой проблемы, рекомендуется использовать слабую ссылку на self, например:

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

Пожалуйста, посмотрите Документация Apple - Избегайте сильных ссылочных циклов при захвате себя для более подробной информации.

Ответ 3

__block CURRENTViewController *blocksafeSelf = self;

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

Ответ 4

Можно ли вызвать метод [self methodName] изнутри блока?

Да, почему бы и нет. Если ваш tempFunction является методом экземпляра, вы можете это сделать. Вызов метода должен быть единственным ограничением.

Ответ 5

Интересно, [fader setFunction: tempFunction]; затем является синхронным или асинхронным. блоки нажимают на stack.so в MRR, если вы его не сохраните, он выскочит.

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

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

    [fader setFunction:tempFunction];
    //if the tempFunction execute there will be right.
}//there the tempFunction pop off
 //....some thing go on
 //execute the tempFunction will go wrong.