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];
}
我已经搜索了几天,我找不到任何证据证明这是可能的.
这是完全可能的,还是我试图使用块来做他们不想要的东西?
我使用块的原因是我创建了一个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];
}
也许我不允许给推子这个功能......?
Dav*_*ong 139
是的,你可以这样做.
但请注意,块将保留self.如果你最终将这个块存储在一个ivar中,你可以轻松地创建一个保留周期,这意味着它们都不会被解除分配.
要解决这个问题,您可以:
- (void) someMethodWithAParameter:(id)aParameter {
  __block MySelfType *blocksafeSelf = self;
  void (^tempFunction)(void) = ^ {
      [blocksafeSelf changeWindow:game];
  };
  [self doSomethingWithBlock:tempFunction];
}
的__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
    }
}
请查看Apple文档 - 捕获自我时避免强引用周期以获取 更多详细信息.
| 归档时间: | 
 | 
| 查看次数: | 41806 次 | 
| 最近记录: |