- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想代码本身就说明了一切,所以请看下面的代码。
-(RACSignal *)bossMethod {
@weakify(self)
return [[[self method1] flattenMap:^RACStream *(id value) {
@strongify(self)
return [self method2];
}] flattenMap:^RACStream *(id value) {
@strongify(self)
return [self method3];
}];
}
基本上,我链接信号以逐步执行多个方法。但是方法 3 根本没有被调用。所以我坚持下去,发现在 [self method3]
即将被调用的时候 self 变成了 nil。它是怎么发生的?为什么 @strongify(self)
在这种情况下不起作用?如果有任何建议,我将不胜感激。
最佳答案
self
可能在执行第一个和第二个 flattenMap
block 之间设置为 nil
(因为最后一个 strong
对 self
对象的引用已被删除)。
一般来说,@strongify
不保证一个变量是非零的。它只保证它不会突然设置为 nil
在 范围内(在您的情况下,在 flattenMap
block 内)。
假设您还没有使用过 @strongify
并且有以下代码:
@weakify(self)
return [[self method1] flattenMap:^RACStream *(id value) {
[self doSomethingPossiblyLong]; //1
return [self method2]; //2
}];
现在在传递给 flattenMap
的 block 中,您执行两个操作。第一 (1) 个执行一些(可能很长的)计算。第二个 (2) 执行的操作取决于 (1) 的结果。并且您处理多线程代码,因此在这些计算期间(或之后)另一个线程可以启动。
在第二个线程中,可能会删除对您的 self
对象的最后一个强引用。例如,它可能是 UI(主)线程,它可以关闭拥有该对象的 View Controller 。然后 ARC 将完成它的工作,将对该对象的所有弱引用转换为 nil
。
现在执行回到 flattenMap
block ,到这一行:
return [self method2]; //2
但是self
变成了nil
。之前的计算都白费了,太可惜了。
在这种情况下,使用@strongify
是有意义的。因为您想确保在 flattenMap
block 中的代码开始执行后,对 self
的引用(或包装在 @strongify
中的其他变量) macro) 直到 block 的最后才为 nil
。
请注意,在您发布的代码中,flattenMap
中只有单个方法调用,因此您并没有真正受益于 @strongify
。但使用它可能仍然是一个好习惯,所以当您在 block 中添加更多调用 self
的方法时,您不会忘记它。
关于ios - 即使在 Reactivecocoa 中加强, self 也变为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35557724/
从 iOS 9 及更高版本开始,出于安全目的,Apple 强制用户向特定主机发出 HTTPS 请求,或者如果必须发出 HTTP 请求,Apple 希望用户在 plist 中提供相同的信息。 类似于:
我想知道,除了使用 format compact 之外,是否还有一种方法可以使矩阵的显示更紧凑或更紧凑(可能是第三方包-格式化矩阵的输出?) 这是在 MATLAB 中显示的矩阵示例,格式为 compa
我有一个项目,需要在 HTTP Web 服务器上进行安全交易。我完全控制客户端(移动应用程序)并控制服务器。我想开发一个系统,客户端可以在其中添加或减去存储在服务器数据库中的值。存储的值是基于货币的,
我是一名优秀的程序员,十分优秀!