在UI中经常会用到Block,对于一些新手程序猿而言,block可能有点小困难,我在下面写了一个小的程序,可以非常好的理解Block的实现机制:
//
// Person.h
// TestOfBlock
#import <Foundation/Foundation.h>
typedef void(^myName)(NSString *name,NSString *gender);
@interface Person : NSObject
@property (copy, nonatomic) myName name;
- (void)whatsMyNmae;
- (void)showTheNmae:(myName)cName;
@end
//
// Person.m
// TestOfBlock
#import "Person.h"
@implementation Person
- (instancetype)init {
self = [super init];
if (self) {
NSLog(@"1");
}
return self;
}
- (void)whatsMyNmae {
NSString *myName = @"小明";
NSString *myGender = @"男";
self.name(myName,myGender);// 回调 代码块 实现; block特有的特性: 先实现代码块,然后再调用
NSLog(@"6");
}
- (void)showTheNmae:(myName)cName {
self.name = cName;
NSLog(@"3");
}
@end
//
// ViewController.m
// TestOfBlock
#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Person *per = [[Person alloc] init];
NSLog(@"2");
[per showTheNmae:^(NSString *name, NSString *gender) {
NSLog(@"%@,%@",name,gender);
NSLog(@"5");
}];
NSLog(@"4");
[per whatsMyNmae];
}
@end
//打印结果,1, 2, 3, 4, 小明 男, 5, 6
如果我们不想在ViewController里面调用block,直接实现的话,可以这样调整:
在person的实现block方法里调用,
- (void)showTheNmae:(myName)cName {
self.name = cName;
[self whatsMyNmae];
NSLog(@"3");
}
然后在ViewController里面注销掉 whatsMyNmae 的调用
[per showTheNmae:^(NSString *name, NSString *gender) {
NSLog(@"%@,%@",name,gender);
NSLog(@"5");
}];
NSLog(@"4");
// [per whatsMyNmae];
}
@end
//打印结果: 1, 2, 小明 男, 5, 6, 3, 4