Objective-C block如何捕获非对象值?
这是苹果官方指南中的一个例子 现在,对于对象值,很容易理解,它保留了对它的引用。所以后来,当它的原始引用更改为指向其他对象时,或者只是被销毁。此引用仍然存在,因此引用计数不会为零,并且保留原始值Objective-C block如何捕获非对象值?,objective-c,Objective C,这是苹果官方指南中的一个例子 现在,对于对象值,很容易理解,它保留了对它的引用。所以后来,当它的原始引用更改为指向其他对象时,或者只是被销毁。此引用仍然存在,因此引用计数不会为零,并且保留原始值 但是,对于上面的示例代码,它不是一个对象。块保留对它的引用,然后值更改为84。我认为这是对自身的更改,而不是对其副本的更改,这意味着指针指向的值已更改。它怎么可能仍然是42?块引入了必要的间接寻址,以确保发生这种情况。看起来是本地的但被块捕获的变量实际上是由编译器在堆上分配的。除其他事项外,这对于该变量
但是,对于上面的示例代码,它不是一个对象。块保留对它的引用,然后值更改为84。我认为这是对自身的更改,而不是对其副本的更改,这意味着指针指向的值已更改。它怎么可能仍然是42?块引入了必要的间接寻址,以确保发生这种情况。看起来是本地的但被块捕获的变量实际上是由编译器在堆上分配的。除其他事项外,这对于该变量能够超过其在中声明的函数的生存期是必要的。块引入了必要的间接方法,以确保发生这种情况。看起来是本地的但被块捕获的变量实际上是由编译器在堆上分配的。除其他事项外,该变量必须能够超过其声明的函数的生命周期。来自文档部分: 以下规则适用于块内使用的变量:
规则3适用于问题中的代码。长话短说:复制整数值。(更准确地说:结构和对象引用也会被复制。但对于对象引用,它是一个引用。)
顺便说一句:这就是闭包的意思。这就是为什么要关闭。他们存在的原因。你想要的正是这种行为。否则,您必须确保在块运行时(可能是几秒钟或几分钟后)不会更改值。长话短说:复制整数值。(更准确地说:结构和对象引用也会被复制。但对于对象引用,它是一个引用。)
顺便说一句:这就是闭包的意思。这就是为什么要关闭。他们存在的原因。你想要的正是这种行为。否则,您必须确保在块运行时(可能是几秒钟或几分钟后)不会更改值。这不是原因,编译器会检测块是否可以保留捕获变量的范围。复制的原因(可以保存在堆栈或堆上)是,这是闭包的含义。这不是原因,编译器会检测块是否可以保留捕获变量的范围。复制(可以在堆栈或堆上保存)的原因是,这就是闭包的含义。
int anInteger = 42;
void (^testBlock)(void) = ^{
NSLog(@"Integer is: %i", anInteger);
};
anInteger = 84;
testBlock();
Integer is: 42