成员block
块是基于栈的
当在一个函数或方法中定义一个块变量时,编译器会在栈上创建一个结构来保存块所引用的任何本地变量的值,它引用的读写变量的地址及指向块的可执行代码的指针。
但block也可以作为成员使用,需要把块由栈拷贝到堆上。
代码示例
1.头文件
1
2
3
4
5
6
7
8
9
10
11
12
|
// QBlock.h
#import <Foundation/Foundation.h>
typedef void(^printBlock)(NSString* toDo);
@interface QBlock : NSObject
{
printBlock _printBlock;
}
- (void)print:(NSString*)infomation;
@end
|
2.实现文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
// QBlock.m
#import "QBlock.h"
@implementation QBlock
- (id)init {
self = [super init];
if (self) {
printBlock pb = ^(NSString* toDo){
NSLog(@"infomation:%@", toDo);
};
_printBlock = [pb copy];
NSLog(@"after block copy retainCount =%d", [_printBlock retainCount]);
}
return self;
}
- (void)dealloc {
[_printBlock release];
NSLog(@"after block release retainCount =%d", [_printBlock retainCount]);
[super dealloc];
}
- (void)print:(NSString*)infomation {
_printBlock(infomation);
}
@end
|
3.代码示例
1
2
3
|
QBlock* block = [[QBlock alloc] init];
[block print:@"BLOCK以成员的形式使用"];
[block release];
|
4.执行情况
1
2
3
4
|
2013-04-05 17:45:44.542 test[31997:c303] infomation:tom go to park
2013-04-05 17:45:44.543 test[31997:c303] after block copy retainCount =1
2013-04-05 17:45:44.543 test[31997:c303] infomation:BLOCK以成员的形式使用
2013-04-05 17:45:44.544 test[31997:c303] after block release retainCount =1
|
5.为什么模拟器上不用[pb copy]也是可以的呢?
再看下;后来看其他资料上这么说的
如果你尝试上面[pb copy],有可能看上去可以正常工作。这可能是编译器在这个示例中已经安排了代码的一种偶然的方式。
当代码超过作用域之后,编译器自由使用块在栈帧中所占用的空间。
如果编译器重新使用该空间,尝试执行超过作用域的块,更有可能导致程序崩溃。
文章作者
梵梵爸
上次更新
2013-04-05
许可协议
原创文章,如需转载请注明文章作者和出处。谢谢