Я только что столкнулся с блоками, и я думаю, что они именно то, что я ищу, за исключением одного: можно ли вызвать метод [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.