iOS块对象没有复制?

Mor*_*ang 3 block objective-c ios

最近我了解到如果我需要保留一个块对象,我应该复制块,因为它是在堆栈上创建的.

然后我回顾一下我的一些代码.我发现我做的事情是这样的:

@implementation MyView
...
-(void) addButton:(NSString *)title clickAction:(void ^(void)) action {
    [self.buttons addObject:@[ title, action ] ];
}
-(void) createButtons { ... }
...
@end

...

// Somewhere in my project:
-(void) init {
     MyView *view = [MyView new];
     [view addButton:@"OK"     clickAction:^{ NSLog(@"OK");     }];
     [view addButton:@"Cancel" clickAction:^{ NSLog(@"Cancel"); }];
}
Run Code Online (Sandbox Code Playgroud)

基本上,我向MyView添加了一些按钮信息.在某些时候,MyView将创建按钮.单击该按钮时,MyView将找到相应的clickAction,并调用它.

奇怪的是,这个程序工作正常,没有例外,没有错误.

那么,为什么程序运行而不复制块对象?

其他信息:*iPhone应用程序(4.3 - 6.0)*非ARC*XCode 4.5

das*_*ght 7

在幕后,块实现包括两部分:

  • 块的可执行代码,和
  • 包含块中使用的变量值的数据结构

只有块的第二部分放在堆栈上并复制到堆内存中; 第一部分编译到程序的代码段,不会被复制.

由于您的块实现不引用周围范围中的任何变量,因此其块的数据部分为空.这就是你的代码有效的原因:没有什么可以复制的!但是,您应该添加块复制,因为否则对块的代码进行少量更改将会破坏您的应用程序,而无需编译器注意任何事情.