block和代理小结
代理使用原则: 代理方法的参数是要传的值,代理方法的返回值是要得到的值(即要调用的类回传的值),并且在实现的代理方法中的值就是原来的类要传的值(设置delegate=self),
比如2个类 A,B
A类中有个代理方法(int)Adelegate(int a)
B类实现代理方法(int)Adelegate(int a){ return b;}
那么 a是传给B类的值,而b是传给A类的值。
例子:
首先关于代理
@protocol NextViewControllerDelegate<NSObject>
@optional
-(void)passString:(NSString *)text;
@end
@optional
-(void)passString:(NSString *)text;
@end
@interface NextViewController : UIViewController
@property (nonatomic,weak) id<NextViewControllerDelegate> delegate;
@end
.m文件中
if ([self.delegate respondsToSelector:@selector(passString:)]) {
[self.delegate passString:self.backBtn.titleLabel.text];
[self.delegate passString:self.backBtn.titleLabel.text];
}
另一个类中
nvc.delegate=self;
#pragma mark -delegate
-(void)passString:(NSString *)text
{
self.name.text= text;
-(void)passString:(NSString *)text
{
self.name.text= text;
}
1.biock被定义成属性的时候
如
typedef void(^passString)(NSString *text);
@interface NextViewController : UIViewController
@interface NextViewController : UIViewController
@property (nonatomic,copy) passString passStr;
@end
.m中
if (self.passStr) {
self.passStr(self.backBtn.titleLabel.text);
self.passStr(self.backBtn.titleLabel.text);
}
另一个类中
nvc.passStr=^(NSString *text){
self.name.text=text;
self.name.text=text;
};
那么block和代理的作用几乎一样,就是在自己类中声明和调用,实现是在别的类中。
2.如果block在自己类中声明了,同时作为函数的参数了,作用和代理也差不多,调用的时机依旧是在别的类中了控制的。
typedef void(^passString)(NSString *text);
@interface NextViewController : UIViewController
-(void)passStr:(passString)passStr;
@end
.m文件中
-(void)passStr:(passString)passStr
{
if (passStr) {
passStr(self.backBtn.titleLabel.text);
{
if (passStr) {
passStr(self.backBtn.titleLabel.text);
}
}
另一个类中
[nvc passStr:^(NSString *text) {
self.name.text=text;
self.name.text=text;
}];
3.用block实现的链式调用
如果是一个类的属性或对象方法那么可以用. 点出来
如果点出来还能带参数,就是+()那么这个属性或者对象发放必须是函数指针或者就是block的类型或返回值。
如果要连续的点出来,那么就是说要函数指针或block返回的是指向自己的类型。
所以如下:
@interface WXChainManager : NSNumber
-(WXChainManager * (^)(int a))add;//add不可以带参数,在调用的时候带参数。此时add更像是一个block或函数指针;
@end
.m中
-(WXChainManager * (^)(int a))add
{
return ^(int a){
NSLog(@"%d",a);
return self;
};
{
return ^(int a){
NSLog(@"%d",a);
return self;
};
}
其他类中调用
chain.add(10).add(22).add(33);
结果:
2016-05-31 15:27:56.936 使用block链式调用[2367:292422] 10
2016-05-31 15:27:56.936 使用block链式调用[2367:292422] 22
2016-05-31 15:27:56.937 使用block链式调用[2367:292422] 33
下面是个简单的加法链式计算:
typedef WXChainManager * (^calculator)(int a);
@interface WXChainManager : NSNumber
@property (nonatomic,assign) int result;
@property (nonatomic,copy) calculator add;
@interface WXChainManager : NSNumber
@property (nonatomic,assign) int result;
@property (nonatomic,copy) calculator add;
@end
。m中
//就是add的getter方法
-(calculator)add
{
return ^(int a){
self.result=self.result+a;
return self;
};
{
return ^(int a){
self.result=self.result+a;
return self;
};
}
使用:
WXChainManager *chain=[[WXChainManager alloc] init];
int reslut= chain.add(10).add(22).add(33).result;
int reslut= chain.add(10).add(22).add(33).result;
NSLog(@"%d",reslut);
2016-05-31 15:37:56.956 使用block链式调用[2367:292422] 65
总结:block作为函数的参数的时候就是用来传值的。做函数的返回值的时候用来连续操作。