gpt4 book ai didi

ios - 使用addObserverForName时保留循环:object:queue:usingBlock:

转载 作者:行者123 更新时间:2023-12-03 17:21:07 26 4
gpt4 key购买 nike

我是 block 编程新手。我的 Listener 类中有以下代码(不使用 arc):

- (void)someBlock:((void)^(NSDictionary *)myDictionary)myBlock
{
__block Listener *weakSelf = self;
weakSelf = [[NSNotificationCenter defaultCenter]
addObserverForName:@"MyNotification"
object:nil
queue:nil
usingBlock:^(NSNotification *note)
{
//--- Here have the retain cycles
myBlock(note.userInfo);
[[NSNotificationCenter defaultCenter] removeObserver:weakSelf
name:@"MyNotification"];
}];
}

在我的 DoMyStuff 类(class)中:

... some code
Listener *myListener = [[[Listener alloc] init] autorelease];
[myListener someBlock:((void)^(NSDictionary *)myDictionary)myBlock{
[self.someProperty doSomething:myDictionary];
}];

谁能告诉我解决循环引用的正确方向?我已经检查过这两个问题

  1. "Correct management of addObserverForName:object:queue:usingBlock:"
  2. "Why doesn't Remove Observer from NSNotificationCenter:addObserverForName:usingBlock get called"

但是他们没有在另一个 block 中使用 block ,因此,那里的解决方案对我不起作用。

最佳答案

这里的问题是您在 block 内使用 [self.someProperty doSomething:myDictionary]; 从而保留 self.请注意,使用 ivars 会导致循环引用,因为它与 self->ivar 相同。

通常看起来像这样(__weak/__unsafe_unretained 用于 ARC,__block 用于 MRR)

__weak ClassName *weakSelf = self;
[SomeClass someMethodWithBlock:^{
// use weakSelf here; if you want to make sure that self is alive throughout whole block, do something like ClassName *strongSelf = weakSelf;
}];

有一个不错的图书馆https://github.com/jspahrsummers/libextobjc其中有 @weakify/@strongify 宏(可能仅限 ARC)。

如果可能的话,你应该使用 ARC(如果我没记错的话,它可以从 iOS 4 开始使用,并且从 iOS 5 开始有 __weak,现在应该没问题了)。

关于ios - 使用addObserverForName时保留循环:object:queue:usingBlock:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27250524/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com