更新问题I使情况更加清楚,因此您“需要”从块中访问原始值。
我不知道下面的代码是否有任何实际用途,但只是为了学习和实验,请考虑以下几点:
__block int one = 1;
int(^capture)() = ^{
int copiedOne = one; // Copy one
++one; // Add one
return copiedOne;
};
NSLog(@"one: %i", one); // one = 1
NSLog(@"copied one: %i", capture()); // Returns copiedOne = 1, one is now 2
NSLog(@"one after calling block: %i", one); // one = 2
one += 10; // one = 12
NSLog(@"one: %i", one); // Prints 12
NSLog(@"copied one: %i", capture()); // Returns copiedOne = 12, one is now 13
NSLog(@"one after calling block: %i", one); // one = 13如果您想在块中保留非常初始值1,还可以在块内修改one (我不知道)。也许有一天您可能需要这样的行为),是否还有一种方法可以像下面这样将值封装在静态NSNumber变量中呢?
如果one是ClassA实例的私有属性,则可能需要这种行为,但您需要ClassB实例来更新ClassA实例的属性,同时获取one的原始值。您可以从capture调用ClassB并实现上述行为,同时仍然可以访问属性one of ClassA的原始值。
__block int one = 1;
int(^capture)() = ^{
static NSNumber *copiedOne = nil;
if (!copiedOne) {
copiedOne = @(one); // Copy one
}
++one; // Add one
return [copiedOne intValue];
};
NSLog(@"one: %i", one); // one = 1
NSLog(@"copied one: %i", capture()); // Returns copiedOne = 1, one is now 2
NSLog(@"one after calling block: %i", one); // one = 2
one += 10; // one = 12
NSLog(@"one: %i", one); // Prints 12
NSLog(@"copied one: %i", capture()); // Returns copiedOne = 1, one is now 13
NSLog(@"one after calling block: %i", one); // one = 13发布于 2016-01-13 01:51:31
该块捕获它周围声明的变量的任何值,无论您是否使用__block声明。__block声明允许您更改该变量中的值。它本质上改变了块本身如何看待这个变量,如果没有__block声明,它将被认为是块的静态变量。
因此,您应该保留最初的一个变量,而不声明它为__block。然后在创建该块之前复制该变量,并使其成为您想要修改的变量。
int one = 1;
__block copiedOne = one;
void(^capture)() = ^{
++CopiedOne; // Add one
NSLog(@"copiedOne: %i, one: %i", copiedOne, one);
};从苹果文档..。
因为Integer被声明为__block变量,所以它的存储将与块声明共享。
https://stackoverflow.com/questions/34756891
复制相似问题