Mar*_*rty 72 objective-c self objective-c-blocks
我刚刚碰到了块,我认为它们正是我正在寻找的东西,除了一件事:是否可以从块中调用方法[self methodName]?
这就是我想要做的:
-(void)someFunction{
Fader* fader = [[Fader alloc]init];
void (^tempFunction)(void) = ^ {
[self changeWindow:game];
//changeWindow function is located in superclass
};
[fader setFunction:tempFunction];
}
Run Code Online (Sandbox Code Playgroud)
我已经搜索了几天,我找不到任何证据证明这是可能的.
这是完全可能的,还是我试图使用块来做他们不想要的东西?
我使用块的原因是我创建了一个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];
}
Run Code Online (Sandbox Code Playgroud)
也许我不允许给推子这个功能......?
Dav*_*ong 139
是的,你可以这样做.
但请注意,块将保留self.如果你最终将这个块存储在一个ivar中,你可以轻松地创建一个保留周期,这意味着它们都不会被解除分配.
要解决这个问题,您可以:
- (void) someMethodWithAParameter:(id)aParameter {
__block MySelfType *blocksafeSelf = self;
void (^tempFunction)(void) = ^ {
[blocksafeSelf changeWindow:game];
};
[self doSomethingWithBlock:tempFunction];
}
Run Code Online (Sandbox Code Playgroud)
的__block关键字的装置(除其他外)被引用的对象将不被保留.
sky*_*der 23
接受的答案已过时.__block在这种情况下使用会导致错误!
为避免此问题,最佳做法是捕获弱引用self,如下所示:
- (void)configureBlock {
XYZBlockKeeper * __weak weakSelf = self;
self.block = ^{
[weakSelf doSomething]; // capture the weak reference
// to avoid the reference cycle
}
}
Run Code Online (Sandbox Code Playgroud)
请查看Apple文档 - 捕获自我时避免强引用周期以获取 更多详细信息.
| 归档时间: |
|
| 查看次数: |
41806 次 |
| 最近记录: |