gpt4 book ai didi

swift - 为什么我们需要一个 weakSelf 用于闭包中的函数/方法?

转载 作者:搜寻专家 更新时间:2023-10-31 22:12:36 26 4
gpt4 key购买 nike

阅读 my own answer .我完全理解为什么我们需要成员/属性的 weakSelf。他们可以创造内存周期。但是属性有一个内存位置。函数也有内存位置吗?!我的意思是不是一个功能只是在旅途中发生的事情?如果是这样,内存位置类型与属性位置有什么不同吗?

如果我不使用 self 引用,我会收到此错误。

Call to method 'alertFunc' in closure requires explicit 'self.' to make capture semantics explicit

与以下内容略有不同:

Reference to property 'window' in closure requires explicit 'self.' to make capture semantics explicit

我的代码如下:

let another = UIAlertAction(title: "Log", style:UIAlertActionStyle.Default){action in  
logAction ()

}

private func logAction () {

print("health")

}

最佳答案

感谢我在聚会上认识的 iOS Nerd

tl;dr 你需要为 instance 方法使用 self,但不需要为 class 方法使用它。一个类可以有很多实例,但它只能有一个声明(也包含它的类型/类/静态函数)。

为什么会发生错误 1:请记住,alertFunc 可能有对属性的引用。

它可能是:

private func logAction () {

print("someProperty = \(self.someProperty)")

}

因此,在这种情况下,很明显您最终引用了一个属性。


为什么会出现错误 2: 即使您在函数中没有对 self 的引用,仍然因为您将其编写为实例方法,所以 self 是隐含地传递了。但是,我们没有看到!

实例方法实际上只是第一个参数采用实例的函数的语法糖,它是自动传递的。

在引擎盖下它可能看起来像这样东西:

private func alertFunc (_ instance: MyType) {

print("someProperty = \(instance.someProperty)")

}

// and actually the call to it *may* look something like this:

MyType.someFunc(self)

我们永远不会看到 self 被传递!这是一种欺骗我们的语法糖。

因此,如果您的方法不在内部使用 self(即不以任何方式依赖于实例的状态),那么实际上最好将其设为 static/type/class method或免费功能。


备选方案 1: 使用免费功能。

class someClass {

...

}

func freeFunc {
print("Hi this is a free function, written outside the scope of any class...")
}

然后在闭包中使用 freeFunc()

调用它

备选方案 2:使用类函数。

class someClass {

...

class private func alertFunc() {
print("Hi this was a class function, see the class at the beginning of the func definition")
}
}

然后在闭包中使用 yourClassName.alertFunc()

调用它

但是,为什么类函数不创建内存循环而实例函数却创建内存循环? 很高兴你问:

对于实例方法,对于您接触到的每个实例,都有一个内存位置并生成一个内存周期,该内存周期将持久释放。

对于类方法,每次您接触到类/类型方法时,您都会接触到相同类/类型方法,并且当您坚持该类方法时,您将不会一遍又一遍地创建它,它只创建一次就完成了!

在 objective-C(和 C++)类型的方法中:

当应用程序启动时,系统可以相当安全地预先分配所有指令 对于那些类型方法连同它们的类指针一起进入内存 所以一遍又一遍地调用它们几乎没有开销。
我想 swift 也在做同样的事情

关于swift - 为什么我们需要一个 weakSelf 用于闭包中的函数/方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40937219/

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