block快捷方式:
inlineBlock
returnType(^blockName)(parameterTypes) = ^(parameters) {
statements
};
name:
类型的别名
typedef
void
(^BlockName)();
block别名快捷方式:
typedefBlock
typedef
returnType(^name)(arguments);
Person.h
block:ARC
使用
strong,
非
ARC
使用
copy
block
类型
:void(^)()
@property
(
nonatomic
,
strong
)
void
(^operation)();
//
参数类型
:block
类型
- ( void )eat:( void (^)())block;
- ( void )run:( int )metre;
- ( void )eat:( void (^)())block;
- ( void )run:( int )metre;
// 返回值
类型
:block
类型
- (void(^)(int))run;
Person.m
- (
void
)run:(
int
)metre
{
NSLog( @"%d" ,metre);
}
- ( void (^)( int ))run
{
return ^( int meter){
NSLog( @" 跑了 %d 米 " ,meter);
};
NSLog( @"%d" ,metre);
}
- ( void (^)( int ))run
{
return ^( int meter){
NSLog( @" 跑了 %d 米 " ,meter);
};
}
block开发中使用场景
ViewController.h
1.把block保存到对象中,恰当时机的时候才去调用
- (
void
)block
{
// block
声明
,
定义
void(^block)() = ^() {
//
保存什么样的代码
NSLog( @" 执行 block" );
NSLog( @" 执行 block" );
};
// block
作用
:
帮你保存一份代码
,
等到恰当时机的时候才去调用
//
调用
block
block();
}
- (
void
)block1
{
Person *p = [[ Person alloc] init];
{
Person *p = [[ Person alloc] init];
第一种赋值
void(^block)() = ^() {
NSLog(
@"
执行对象中
block"
);
};
p.
operation
= block;
第二种赋值
p.operation = ^(){
NSLog( @" 执行对象中 block" );
};
_p
= p;
}
2.把block当做方法的参数使用,外界不调用,都是方法内部去调用,Block实现交给外界决定
- (
void
)block2
{
Person *p = [[Person alloc] init];
第一种赋值
void
(^block)() = ^{
NSLog( @" 吃东西 " );
};
[p eat :block];
NSLog( @" 吃东西 " );
};
[p eat :block];
第一种赋值
传入
block
给参数的
Block
赋值
[p
eat
:^{
NSLog( @" 吃东西 " );
}];
NSLog( @" 吃东西 " );
}];
}
3.把block当做方法的返回值,目的就是为了代替方法.block交给内部实现,外界不需要知道Block怎么实现,只管调用(封装内部的实现,把block当做方法返回值)
- (
void
)block3
{
Person *p = [[ Person alloc] init];
// 一般 OC 实现方法
[p run :2];
//block 的实现方法
Person *p = [[ Person alloc] init];
// 一般 OC 实现方法
[p run :2];
//block 的实现方法
//
第一种调用
(
只有返回值是
block
才可这样调用)
. 是使用get方法,必须有返回值
p.
run
(2);
// 第二种调用
void (^run)( int ) = p. run ;
run(2);
// 第二种调用
void (^run)( int ) = p. run ;
run(2);
}