首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >目标-C在捕获带有__block修饰符的变量时如何在块内保持初始值

目标-C在捕获带有__block修饰符的变量时如何在块内保持初始值
EN

Stack Overflow用户
提问于 2016-01-13 01:25:58
回答 1查看 336关注 0票数 0

更新问题I使情况更加清楚,因此您“需要”从块中访问原始值。

我不知道下面的代码是否有任何实际用途,但只是为了学习和实验,请考虑以下几点:

代码语言:javascript
复制
__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变量中呢?

如果oneClassA实例的私有属性,则可能需要这种行为,但您需要ClassB实例来更新ClassA实例的属性,同时获取one的原始值。您可以从capture调用ClassB并实现上述行为,同时仍然可以访问属性one of ClassA的原始值。

代码语言:javascript
复制
__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
EN

回答 1

Stack Overflow用户

发布于 2016-01-13 01:51:31

该块捕获它周围声明的变量的任何值,无论您是否使用__block声明。__block声明允许您更改该变量中的值。它本质上改变了块本身如何看待这个变量,如果没有__block声明,它将被认为是块的静态变量。

因此,您应该保留最初的一个变量,而不声明它为__block。然后在创建该块之前复制该变量,并使其成为您想要修改的变量。

代码语言:javascript
复制
int one = 1;
__block copiedOne = one;
void(^capture)() = ^{
     ++CopiedOne;  // Add one
     NSLog(@"copiedOne: %i, one: %i", copiedOne, one);
};

从苹果文档..。

因为Integer被声明为__block变量,所以它的存储将与块声明共享。

链接到这里的文档

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34756891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档