从一个块内调用[ 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 类,并且我想存储一个块,以便它在淡出结束时执行。

谢谢你

编辑: 好吧,我加入了建议,但我仍然得到一个 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];
}

也许我不能给 褪色剂函数... ?

44456 次浏览

是的,你能做到。

但是请注意,该块将保留 self。如果您最终将这个块存储在一个 ivar 中,您可以 很容易创建一个保留循环,这意味着两者都不会被释放。

为了解决这个问题,你可以这样做:

- (void) someMethodWithAParameter:(id)aParameter {


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


[self doSomethingWithBlock:tempFunction];


}

__block关键字意味着(除其他外)不会保留被引用的对象。

是否可以从一个块中调用一个方法[ self methodName ] ?

是的,为什么不呢。如果您的 tempFunction是一个实例方法,那么您可以这样做。被调用的方法应该是可访问的,这是唯一的限制。

我想知道您[ fader setFunction: temfunction ] ; 然后是同步的还是异步的。 块被推到堆栈上,所以在 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.

公认的答案是 过时了。在这种情况下使用 __block会导致错误!

为了避免这个问题,最好的做法是捕获对 self软弱引用,如下所示:

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

请参考下面的链接: http://developer.Apple.com/library/ios/document/Cocoa/Concept/Programming WithObjectiveC/WorkingwithBlocks.html//Apple _ ref/doc/uid/TP40011210-CH8-SW16”rel = “ noReferrer”> Apple Document-< Strong > 在捕捉自我时避免强参考周期 了解更多细节。

__block CURRENTViewController *blocksafeSelf = self;


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

考虑一下这个(我认为这是最佳实践)

@implementaion ViewController


- (void) viewDidLoad {
__weak typeof(self) wself = self;
[xxx doSomethingUsingBlock: ^{
__strong typeof(wself) self = wself;
[self anotherMessage];
}];
}


@end

此外,还可以定义包装器宏。

#define MakeWeakSelf __weak typeof(self) wself = self
#define MakeStrongSelf __strong typeof(wself) self = wself