gpt4 book ai didi

iphone - iOS 4 阻止并保留计数

转载 作者:行者123 更新时间:2023-12-03 18:20:05 24 4
gpt4 key购买 nike

我刚刚开始使用街区和 Grand Central Dispatch。我被告知(并在 Apple Documentation 中读到),从 block 内引用的任何对象都会被保留。

例如:

^{  
self.layer.transform = CATransform3DScale(CATransform3DMakeTranslation(0, 0, 0), 1, 1, 1);
self.layer.opacity = 1;
}

“self”被保留,因此会泄漏。为了避免这种情况,我需要将 self 分配给:

__block Object *blockSelf = self;

然后使用 blockSelf而不是self在我的街区内。

我的问题是:当您的 block 有更多代码并引用多个对象时会发生什么?我需要将它们全部分配给 __block物体?例如:

^{  
[self doSomething];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"prevName == %@", artistName];
[request setEntity:entity];
[request setPredicate:predicate];

Object *newObject = [[Object alloc] init];
[someArray addObject];
[newObject release];
}

最佳答案

没有。当您的 block 保留一个保留它的对象时,就会出现问题。您的 block 将保留它引用的任何对象,但那些用 __block 注释的对象除外。因此:

// The following creates a retain cycle which will leak `self`:
self.block = ^{
[self something];
};

self 保留 block,并且 block 隐式保留 self。这也将如果您引用 self 的实例变量,就会发生这种情况。

// The following avoids this retain cycle:
__block typeof(self) bself = self;
self.block = ^{
[bself something];
};

__block注释的变量是可变的(对于指针来说,即它们指向的地址可以更改);结果,没有意义保留该对象,因为您需要将该对象视为局部变量(如,它可以被重新分配,影响 block 范围之外的对象)。因此,__block 不会被 block 保留。

但是,现在如果您尝试以某些方式使用此 block ,您可能会遇到不可预见的问题。例如,如果您决定以某种方式延迟调用此 block ,并且在执行该 block 时 self 已被释放,则您的程序将崩溃,因为您正在向已释放的 block 发送消息目的。那么你需要的是一个弱引用,在非垃圾收集环境中并没有提供开箱即用的弱引用!

一种解决方案是使用MAZeroingWeakRef包裹你的 block ;这会将指针清零,这样如果您在释放 self 后尝试向 self 发送消息,最终只会向 nil 发送消息:

MAZeroingWeakRef *ref = [MAZeroingWeakRef refWithTarget:self];
self.block = ^{
[ref.target something];
};

我还实现了 weak reference wrapper in Objective-C++ ,它提供了更轻量级语法的好处:

js::weak_ref<SomeClass> ref = self;
self.block = ^{
[ref something];
};

因为 js::weak_ref 是一个类模板,所以您将获得方便的强类型(也就是说,如果您尝试向引用发送消息,您将在编译时收到警告它似乎没有回应)。但是 Mike 的 MAZeroingWeakReference 比我的成熟得多,所以我建议使用他的,除非你想亲自动手。

要了解有关 __block 问题和弱引用用例的更多信息,请阅读 Avoiding retain cycles with blocks, a right wayJonathan Rentzsch's response .

关于iphone - iOS 4 阻止并保留计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5525567/

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