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開發。