我想调用块内的实例方法。这是我正在使用的方法,
[self.someVariable addBoundaryTimeObserverForTimes:timeArray queue:NULL usingBlock:^{
[self myInstanceMethod];
}];
但是我无法从这个区块中引用自我。我该怎么办?
编辑:很抱歉,我匆匆发布了这个问题。实际上我收到了一个 警告 (捕获'自我'强烈反对此块可能会导致保留周期)用这种方法。
答案 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];
}];