gpt4 book ai didi

ios - 如果从 Block 调用的方法使用 self,我是否需要使用弱 self 指针?

转载 作者:行者123 更新时间:2023-12-02 12:04:49 24 4
gpt4 key购买 nike

在 block 中使用 self. 会导致循环引用,因此我需要创建对 weakSelf 的引用。我明白这一点

但是!

如果我从我的 block 中调用一个使用 self 的方法”,这是否也会导致保留周期?例​​如,如果我从 block 中重新加载 UITableView 并在我调用 self. 的一些 UITableView 委托(delegate)方法中,我是否导致了保留周期?这是否意味着我必须在各处传递这个弱引用?看起来很做作。

最佳答案

我可能误读了你的问题,但你的措辞:

If from my block I call a method which uses "self.", does this too cause a retain cycle? For instance if I reload a UITableView from a block and in some of my UITableView delegates I call "self.", I'm causing a retain cycle? That means I have to pass around this weakReference everywhere?

表明您误解了什么self是。希望如果是这样,以下内容将有助于而不是妨碍您的理解......

什么是self

标识符self只是方法的参数之一的名称,它只是隐式传递,而不是像其他参数一样显式传递。例如,如果您有一个类:

@implementation MyClass

- (void) someMethod:(NSInteger)value
{
... self ... value
}

@end

那么该方法有效(即为了清楚起见稍微歪曲事实):

- (void) someMethod:(NSInteger)value withObject:(MyClass *)self
{
... self ... value
}

当调用实例方法时,为 self 传递的值参数是对方法应操作的实例的引用,例如通话

MyClass *someInstance = ...

[someInstance someMethod:42];

实际上是对以下内容的调用:

someMethod:42 withObject:someInstance

强大的引用循环

只要存在对该对象的强引用,对象(包括类 block 的实例)就保持事件状态。

如果一个对象A拥有强大的引用文献,例如在实例变量或属性中,到对象 B ,然后B只要 B 就会至少保持事件状态(可能还有其他对 A 的强引用)还活着。

如果一个对象A强烈引用 BB持有 1 至 A那么你就有了一个强引用循环 - 每个对象都让另一个对象保持事件状态,并且都不会被收集。这可能导致内存泄漏 - 从未收集未使用的内存 - 除非 AB意味着从创建到程序结束都存在。

此外,您不会仅仅通过将引用存储在方法的局部变量和参数中来创建强引用循环。就其本质而言,这些变量以及它们的内容是 transient 的,并且在方法返回时被销毁。

使用 self以 block 为单位

using "self." in blocks causes retain cycles so I need to create a reference to weakSelf.

不完全是。当您使用self时在 block 中,直接或间接通过引用实例变量,那么编译器将警告您可能创建一个引用循环。(注意:还有其他方法可以创建引用循环,无论是否使用 using block ,编译器根本不会警告您。管理循环只是您需要注意的事情。)

只有在 self 引用的对象中存储对 block 的引用时,您才会真正创建一个循环。 。然而,这本身并不坏,只要在某个时候您手动打破循环 - 例如通过存储 nil在引用 block 的变量中 - 循环根本不需要有问题。

最后...

本身没有什么可担心的:

UITableView delegates I call "self."

那样self只是委托(delegate)的本地参数,其初始值(在调用链的某个时刻)来自于您评估 weakSelf引用并确定它不是 nil然后调用它的方法。

HTH

关于ios - 如果从 Block 调用的方法使用 self,我是否需要使用弱 self 指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27570228/

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