-1

运行此代码并进入x is 11控制台。更改方法范围之外的变量状态对我来说就像是块行为。块是这样工作的吗?

- (void)viewDidLoad
{
    NSNumber *x = [NSNumber numberWithInt:5];
    [self doSomethingWithNumber:&x];
    NSLog(@"x is %@ \n",x);

}

- (BOOL)doSomethingWithNumber:(NSNumber**)aNumber
{
    *aNumber = [NSNumber numberWithInt:11];
    return YES;
}
4

2 回答 2

1

尽管您的示例的非正统语法 - 我认为这只是为了说明一点 - 块从定义它们的词法范围捕获状态是正确的。有关内部结构的更多信息,请查看 Mark Dalrymple 关于块内部结构的这篇文章

通常,来自周围范围的变量在块内具有按值传递的语义,而在__block修饰符下具有按引用传递的语义。因此,这将抛出异常不编译(编辑 2012-09-27 20-52-51)

#import <Foundation/Foundation.h>

typedef int (^IntBlock)();

    int main(int argc, char *argv[]) {
        NSAutoreleasePool *p = [[NSAutoreleasePool alloc] init];

        int n = 5;
        IntBlock alwaysEleven = ^{ 
            n++; 
            printf("n inside the block: %d\n",n);
            return 11;
        };
        int d = alwaysEleven(n);
        printf("result = %d, n = %d", d,n);

        [p release];
    }

但如果我们声明__block int n = 5;它不会。

@leo 建议使用 Blocks 入门。如果您对块如何捕获状态以及捕获的状态的位置(在堆栈上直到Block_copy())感兴趣,那么文档中的块编程主题是值得一读的。

于 2012-09-27T13:19:05.987 回答
0

不,这就是指针的工作原理。如果你想用积木做一些事情,那么请遵循 Apple 的积木入门或网络上的众多优秀教程之一。

于 2012-09-27T11:57:26.987 回答