首先不介绍block的基本概念等,推荐对block的精华阐释:block一点也不神秘
其次说说我的理解:
1. 属性block是可以类比代理来传值的。 因为block里面含参数
例如: 设VC2中有个block的属性,在VC1中初始化VC2,并拿到VC2的block属性,定义block,也是就VC1拿到block中的参数do sth。
在VC2中调用block并传参数,并执行block即可。
这样就是VC2把参数传给block,然后执行block,此时VC1拿到block中的参数,do sth。
这种情况相当于:VC1是VC2的代理。block是协议。
谁要让代理做事,谁就要有block作为属性。
2. block作为方法中的参数。
我的理解为:block就是代码块,一段特定的代码。当执行这个方法时,方法会在适当的时候调用作为参数的block 。
注意:block里面的参数,是这个方法给的,相当于已知条件。方法传参数给这个block,你来决定这个block应该做哪些事。
关键是:block作为参数,是由外部定义的,因此想干嘛干嘛。再次推荐精华block一点也不神秘。
3. block的缺点:如果A要B做某事,就必须B去实现A的block属性。那么现在最关键的问题是,当B要实现A的block时,B必须能够拿到A。
这才是block最关键的地方!!!
4. 用__WEAK 来解除循环引用,注意要关联对象啊。
//获得头像后显示出来
__weakmeLeft*weakMe ;
headVC.passImage= ^(UIImage*image){
weakMe.headImageView.image= image;
};
这段白写了,因为__weakmeLeft*weakMe ;没有指向任何对象啊,仅仅只是一个空指针啊。
应该这样写:__weak meLeft*weakMe = me;
__weak typeof(self) weakSelf =self;
5. block用作函数的参数
两种方法:
A> 直接法:直接写在函数参数里面:- (void)abc:(void (^)(NSString *temp))para ;
B>间接法:利用typedef 定义一个block类型 再把它加到函数参数里面去
//定义了一个block类型 叫completionBlock
typedef void(^completionBlock)(NSString *content,NSString *ispraised);
网友评论