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
在幕后,块实现包括两部分:
只有块的第二部分放在堆栈上并复制到堆内存中; 第一部分编译到程序的代码段,不会被复制.
由于您的块实现不引用周围范围中的任何变量,因此其块的数据部分为空.这就是你的代码有效的原因:没有什么可以复制的!但是,您应该添加块复制,因为否则对块的代码进行少量更改将会破坏您的应用程序,而无需编译器注意任何事情.
| 归档时间: |
|
| 查看次数: |
983 次 |
| 最近记录: |