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