- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在阅读 Xcode 的文档,这让我感到困惑:
__block typeof(self) tmpSelf = self;
[self methodThatTakesABlock:^ {
[tmpSelf doSomething];
}];
以下内容来自文档:
A block forms a strong reference to variables it captures. If you use
self
within a block, the block forms a strong reference toself
, so ifself
also has a strong reference to the block (which it typically does), a strong reference cycle results. To avoid the cycle, you need to create a weak (or__block
) reference to self outside the block, as in the example above.
我不明白“弱(或 __block
)”是什么意思?
是
__block typeof(self) tmpSelf = self;
和
__weak typeof(self) tmpSelf = self;
这里一模一样?
我在文档中发现了另一篇文章:
Note: In a garbage-collected environment, if you apply both
__weak
and__block
modifiers to a variable, then the block will not ensure that it is kept alive.
所以,我完全感到困惑。
最佳答案
来自关于 __block 的文档
__block variables live in storage that is shared between the lexical scope of the variable and all blocks and block copies declared or created within the variable’s lexical scope. Thus, the storage will survive the destruction of the stack frame if any copies of the blocks declared within the frame survive beyond the end of the frame (for example, by being enqueued somewhere for later execution). Multiple blocks in a given lexical scope can simultaneously use a shared variable.
来自关于 __weak 的文档
__weak specifies a reference that does not keep the referenced object alive. A weak reference is set to nil when there are no strong references to the object.
所以它们在技术上是不同的东西。 __block 是为了阻止你的变量从你的外部作用域复制到你的 block 作用域。 __weak 是一个自定界的弱指针。
注意我说的是技术性的,因为对于你的情况,他们会(几乎)做同样的事情。唯一的区别是您是否使用 ARC。如果您的项目使用 ARC 并且仅适用于 iOS4.3 及更高版本,请使用 __weak。如果全局范围引用以某种方式释放,它确保引用设置为 nil。如果您的项目不使用 ARC 或适用于较旧的操作系统版本,请使用 __block。
这里有一个细微的差别,请确保你理解它。
编辑:另一个难题是__unsafe_unretained。此修饰符与 __weak 几乎相同,但适用于 4.3 之前的运行时环境。但是,它没有设置为 nil,并且可能会给您留下悬垂的指针。
关于objective-c - __weak 和 __block 引用有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11773342/
我正在使用这个 findAllMessages() 函数来返回一个 NSString ,其中包含有关每条消息的信息。 一切顺利,直到我走出 block 并且 concatenatedMessage 字
将外部声明的变量引入 block 时... 使用__block指令通过引用捕获变量... Variables local to the enclosing lexical scope declared
现在我正在开发一个横幅,显示 iOS 中的功能它是一个单例,当用户登录时,它会在屏幕的上部显示横幅。 它基本上是一个带有类方法 showWithName 的共享 View ... @interface
我正在尝试搜索提醒列表以检查是否存在提醒。方法中有一个选项可以保存提醒是否存在的值。我正在使用一个 block ,在 block 内,当找到提醒时,新值被分配给 reminderExists 变量,就
我正在尝试将 block 内的结果分配给 block 变量。这是我的代码: __block UIImage *latestImage; ALAssetsLibrary *assetLibrary =
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我应该声明为 (#1) 类名 * __ block 变量名 或 (#2) __block 类名 * 变量名 ? 我看到很多代码使用格式 #2,包括 Apple 的 Blocks Programming
我使用 AFNetworking 库已经有一段时间了,我刚刚遇到了一个问题。我使用了以下代码,它使用 GET 函数从远程 PHP 文件接收数据。 AFHTTPSessionManager *manag
在ARC中,下面这行代码有意义吗?请确认。 __block __weak MyViewController_iPad *blockSelf = self; 这不会抛出任何错误。不知道为什么。 考虑以下
我很困惑为什么我的全局变量在通过一个 block 后不能再次访问它。这是我的代码: __block NSString *latitude; __block NSString *longitude; C
这个问题在这里已经有了答案: Completion handlers and return values (1 个回答) 关闭 9 年前。 我有以下代码: - (Transporter *) get
我必须修复一些使用 LLVM(在 iOS 上)构建得很好的现有代码,以便它也可以使用 llvm-gcc-4.2 构建。除了在几个地方发现的这种模式外,我几乎完成了所有工作: @property (no
我在编译 Objective-C 类时遇到了以下错误: VideoView.h:7: error: __block attribute can be specified on variables on
我有以下代码片段: -(void) doSomething { __block NSMutableArray *objArray = [[NSMutableArray alloc] initW
我可以使用 __block 说明符在堆栈上指定一个变量,然后我可以在一个 block 中修改它。我只是想知道,幕后发生了什么? (如果该 block 在未来的某个时间执行,则堆栈可能会被清除) 最佳答
我想知道如何在方法的上下文中访问 __block 限定的 var 线程安全。 例子: __block NSMutableDictionary *dictionary = [NSMutableDicti
我对 __block 变量的语法有疑问。我知道您可以在范围内的变量上使用 __block ,因此它在 block 内不是只读的。然而在apple docs中的一个位置,我看到了一个替代方案: "Var
Objective-C 中的 __block 关键字究竟是什么意思?我知道它允许您修改 block 内的变量,但我想知道... 它究竟告诉编译器什么? 它还有其他作用吗? 如果仅此而已,那么为什么首先
我想创建以下类方法: +(void) getValue4Key:(NSString*)p_key andSet:(id)p_variable { NSString *baseURLStr
在阅读 NotificationCenter 文档时,我发现了下面的示例代码。我想澄清的是 __block 在这里是什么意思?我知道何时使用 __block 变量可以在块中更改,但 token 不会更
我是一名优秀的程序员,十分优秀!