- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
阅读 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/
这个问题在这里已经有了答案: Does calling a method inside a block that calls another method referring to self cau
我看到了两种不同的实现... __weak UIDataType *weakSelf = self; 和 UIDataType __weak *weakSelf = self; 但它们似乎都有效。引擎
Closed. This question is opinion-based。它当前不接受答案。 想要改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。 4年前关闭。
在以下代码片段 (self.searchResults) 中调用 self 时,我是否应该使用 weakSelf: [self.restaurants enumerateObjectsUsingBlo
有一个关于 weak self 、 blocks 和 retain cycle 的问题。 根据这本书,我明白我们需要在 block 中使用 weakself..问题是,什么时候? 例如,简单的动画代码
我正在查看他们 2014 年 WWDC session “带有 Collection View 的高级用户界面”的一些 Apple 示例代码,并发现了如下所示的 weakself 声明: __weak
weakSelf 的几乎每个例子我在网上遇到的模式有语法 __weak typeof(self) weakSelf = self; 但是编译器在最新版本的 Xcode 中提示这种语法,要求: __we
所以不知何故,我的 weakSelf 变量在我的 block 有机会执行之前被释放了。这只发生在一个特定的场景中,其他时候我点击这个 block 它工作正常。这是我的代码的样子: __weak typ
如果我这样做可以吗: -(void)example{ __weak __typeof__(self) weakSelf = self; dispatch_queue_t
阅读 my own answer .我完全理解为什么我们需要成员/属性的 weakSelf。他们可以创造内存周期。但是属性有一个内存位置。函数也有内存位置吗?!我的意思是不是一个功能只是在旅途中发生的
好的,所以我可能还没有完全掌握何时应该使用 weakSelf以 block 为单位。我知道这样做是为了防止保留周期等等,但我听说这条规则有一些异常(exception)。 在以下代码中,我检查 API
我有以下代码: [[AHPinterestAPIClient sharedClient] getPath:requestURLPath parameters:nil suc
我的代码中有很多 block 。我有一个在登录时初始化用户的过程,我使用 Parse.com 作为我的后端: PFQuery *messageBankQuery = [PFQuery queryWit
我正试图正确地避免在 Objective C 中使用 block 的保留循环,并且不确定是否具有嵌套 block 。 如果我像这样写一个简单的 block : [self doSomethingWit
我知道当我们使用 block 时我们应该使用 weakSelf 来避免 retain cycle。但是我看到有时 block 中有一个 strongSelf。 让我困惑的是: 为什么一定要把weakS
我理解为什么我们会在一个 block 中使用 weakSelf,只是不那么多。 我正在将一个代码库转换为 ARC,它给出了很多带有 block 的保留周期警告。从我收集到的文档中,我需要更改此内容:
这个问题在这里已经有了答案: Strong reference to a weak references inside blocks (2 个答案) 关闭 6 年前。
我听说我应该始终在 block 中使用 weakSelf 以避免循环保留,但是调度 block 呢?在这种情况下,我的方法在以下代码中处理来 self 的服务器的错误响应: //handling se
我已经为这个问题苦苦挣扎了一段时间,因为我不认为我完全理解保留周期。我对此完全陌生,我正在尝试了解更多相关信息。 我收到带有以下代码的 EXC_BAD_ACCESS 消息。 我开始使用 weakSel
例如,我正在使用 SVInfiniteScrolling ( https://github.com/alexanderedge/SVInfiniteScrolling )。 我有一些看起来像这样的代码
我是一名优秀的程序员,十分优秀!