Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标C块通过传递指针的指针工作?_Objective C_Pointers_Pass By Reference - Fatal编程技术网

Objective c 目标C块通过传递指针的指针工作?

Objective c 目标C块通过传递指针的指针工作?,objective-c,pointers,pass-by-reference,Objective C,Pointers,Pass By Reference,运行此代码并在控制台中获取x is 11。在方法范围外更改变量的状态在我看来就像块行为。这就是block的工作原理吗 - (void)viewDidLoad { NSNumber *x = [NSNumber numberWithInt:5]; [self doSomethingWithNumber:&x]; NSLog(@"x is %@ \n",x); } - (BOOL)doSomethingWithNumber:(NSNumber**)aNumber

运行此代码并在控制台中获取
x is 11
。在方法范围外更改变量的状态在我看来就像块行为。这就是block的工作原理吗

- (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;
}

不,指针就是这样工作的。如果你想对块做些什么,那么请遵循Apple或众多优秀教程中的一个。

尽管你的示例使用了非正统语法(我认为这只是为了说明一点),但块从定义它们的词法范围捕获状态是正确的。有关内部构件的更多信息,请查看Mark Dalrymple关于模块内部构件的介绍


通常,来自周围范围的变量在块内具有传递值语义,并使用
\uu块
修饰符具有传递引用语义。因此,这将引发异常not compile(编辑2012-09-27 20-52-51):

#导入
typedef int(^IntBlock)();
int main(int argc,char*argv[]){
NSAutoreleasePool*p=[[NSAutoreleasePool alloc]init];
int n=5;
IntBlock alwaysEleven=^{
n++;
printf(“块中的n个:%d\n”,n);
返回11;
};
int d=始终自偶(n);
printf(“结果=%d,n=%d”,d,n);
[p释放];
}
但是如果我们声明
\uu block int n=5它不会


@利奥建议从积木开始。如果您对块如何捕获状态以及捕获状态的位置感兴趣(在堆栈上,直到
block\u copy()
),那么文档中的块编程主题值得一读。

我知道块语法。我的问题是有关阻塞的内部机制。更具体地说,block是否通过隐式传递变量指针来保持变量在周围上下文中的状态?嗨,谁否决了这个问题,请留下评论。我认为这是一个真正值得回答的问题。“通常情况下,来自周围范围的变量在块内具有传递值语义,并使用_块修饰符具有传递引用语义。”这让我头脑清醒了。非常感谢!“因此,这将抛出一个异常”我认为这是一个编译错误,但按值捕获语义并不一定意味着您不能为其赋值——这是一种语言选择。例如,对于C++11 lambda,通过值捕获的变量仍然可以分配给,如果lambda声明为
可变的
@NSBum,我在四个月后回到这个问题,现在我真正理解了您的答案。学习需要耐心,需要像你这样的人的帮助。再次感谢你。
#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];
    }