typedef void(^ChangeColorBlockT) (NSString *name);
接着你就和创建对象一样的方法声明一个block.
ChangeColorBlockT _theBlcok;
//.h
- (id)initwithBlock:(ChangeColorBlockT)cb;
//.m
- (id)initwithBlock:(ChangeColorBlockT)cb{
self = [super init];
if (self) {
_theBlcok= [cb copy];
}
return self;
}
-(void)dealloc{
[_theBlock release];
[super dealloc];
}
//在某个控制器初始化一个block
//vc1.m
ViewController2 *vc2 = [[ViewController2 alloc] initwithBlock:^(NSString *name) {
NSLog(@"your name is %@",name);
}];
[self.navigationController pushViewController:vc2 animated:YES];
[vc2 release];
//vc2.m
- (IBAction)passValue:(id)sender {
NSLog(@"************");
if (_theBlcok) {
_theBlcok(@"myName");
}
}
//当vc2中对这个block传递值的时候,这个块就开始工作,这样的好处是什么呢?a,我想最大的好处就是不用写传统意义上的delegate方式传值了。
b,代码简介了,让你一眼就知道这个block是干嘛的,不用像以往去查api的delegate方法了。
c,gcd的与block的配合使用。
//还有一点值得提及的是,若在块中要用到self.xxx的时候最好不要这么干,用Class *subclass = self;然后再在块中引用;好处避免不知道对象所有权和引用计数规律的时候漏掉了释放本该释放的。以及一个使用频率最高的__block 关键字的使用。
若在block使用中出现了循环引用,最好拿出笔来画画……分析哪个指向可以打破。再没有熟练使用arc的时候,最好还是使用手动的内存管理,通过合理运用内存管理的黄金法则让你更通透的掌握oc和iphone开发。