Block简介:
Block的实际行为和Function很像,最大的差别是在可以存取同一个Scope的变量值。Block实体形式如下:
^(传入参数列){行为主体};
Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, int c),行为主体由大括号包起来,专有名字叫做block literal。行为主体可以用return回传值,类型会被compiler自动辨别。如果没有参数列要写成: ^(void)。
使用案例:(注意,所有block都用copy属性)
#import
<UIKit/UIKit.h>
typedef
void
(^SelectColorBlock)(
UIColor
*);
typedef void (^SelectLineWidthBlock)( CGFloat );
typedef void (^SelectElse)();
typedef void (^SelectLineWidthBlock)( CGFloat );
typedef void (^SelectElse)();
#import
"SelecteButton.h"
@interface
ToolView :
UIView
@property
(
nonatomic
,
copy
)
SelectColorBlock
selectColorBlock;
@property ( nonatomic , copy ) SelectLineWidthBlock selectLineWidthBlock;
@property ( nonatomic , copy ) SelectLineWidthBlock selectLineWidthBlock;
@property
(
nonatomic
,
copy
)
SelectElse
undoBlock;
@end
@implementation
ToolView
- (
void
)topColorAction:(
UIControl
*)control{
//NSLog(@"ddd");
PALog( @"DDD" );
if ( _selectColorBlock ) {
// 调用 block
self . selectColorBlock ( _colors [control. tag - 200 ]);
}
//NSLog(@"ddd");
PALog( @"DDD" );
if ( _selectColorBlock ) {
// 调用 block
self . selectColorBlock ( _colors [control. tag - 200 ]);
}
}
@end
@implementation
ViewController
- (
void
)viewDidLoad {
toolView.
selectColorBlock
= ^(
UIColor
*color){
panelView. color = color;
};
toolView. selectLineWidthBlock = ^( CGFloat lineWidth){
panelView. lineWidth = lineWidth;
};
toolView. undoBlock = ^(){
[panelView undo ];
panelView. color = color;
};
toolView. selectLineWidthBlock = ^( CGFloat lineWidth){
panelView. lineWidth = lineWidth;
};
toolView. undoBlock = ^(){
[panelView undo ];
};
}
@end
block使用中应该注意的问题,循环引用
下面是典型的解决循环引用的例子,如果是变量在block中改变,应该加上前缀 __block