如何调用块内的实例方法?

时间:2015-06-03 05:39:13

标签: ios objective-c-blocks

我想调用块内的实例方法。这是我正在使用的方法,

[self.someVariable addBoundaryTimeObserverForTimes:timeArray queue:NULL usingBlock:^{
    [self myInstanceMethod];
}];

但是我无法从这个区块中引用自我。我该怎么办?

编辑:很抱歉,我匆匆发布了这个问题。实际上我收到了一个 警告 捕获'自我'强烈反对此块可能会导致保留周期)用这种方法。

4 个答案:

答案 0 :(得分:2)

直接在块中使用self可能会导致保留周期,为了避免保留周期,您应该创建一个对self的弱引用,然后在块内使用该引用来调用实例方法。使用以下代码调用块

中的实例方法
__weak YourViewController * weakSelf = self;
[self.someVariable addBoundaryTimeObserverForTimes:timeArray queue:NULL usingBlock:^{
    [weakSelf myInstanceMethod];
}];

答案 1 :(得分:0)

试试这段代码:

__block YourViewController *blockSafeSelf = self;    
[self.someVariable addBoundaryTimeObserverForTimes:timeArray queue:NULL usingBlock:^{
    [blockSafeSelf myInstanceMethod];
}];

_block将保留self,因此您也可以使用_weak引用:

YourViewController * __weak weakSelf = self;
 [self.someVariable addBoundaryTimeObserverForTimes:timeArray queue:NULL usingBlock:^{
        [weakSelf myInstanceMethod];
    }];

答案 2 :(得分:0)

是的,你可以这样做。

__block YourViewController *blockInstance = self;  
[self.someVariable addBoundaryTimeObserverForTimes:timeArray queue:NULL usingBlock:^{
    [blockInstance myInstanceMethod];
}];

注意:然而,该块将保留自己。如果你最终将这个块存储在一个ivar中,你可以很容易地创建一个保留周期,这意味着它们都不会被解除分配。

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

__weak YourViewController *weakSelf = self;
[self.someVariable addBoundaryTimeObserverForTimes:timeArray queue:NULL usingBlock:^{
    [weakSelf myInstanceMethod];
}];

答案 3 :(得分:0)

如果要在块内调用实例方法。 你可以试试下面的代码,它是由apple建议的 这是https://developer.apple.com/library/mac/referencelibrary/GettingStarted/RoadMapOSX/books/AcquireBasicProgrammingSkills/AcquireBasicSkills/AcquireBasicSkills.html

的链接



__block typeof(self) tmpSelf = self;
[self.someVariable addBoundaryTimeObserverForTimes:timeArray queue:NULL usingBlock:^{
    [tmpSelf myInstanceMethod];
}];

For example
//References to self in blocks

__block typeof(self) tmpSelf = self;
[self methodThatTakesABlock:^ {
    [tmpSelf doSomething];
}];