OC - Block ,单例,代理 简单实现

一、block按钮回调

.h文件

@class KLcustomBtn;

typedef void (^Myblock)(KLcustomBtn *btn);//定义一个block类

@property (nonatomic, strong) MyblockfirstBlock;

+(instancetype)createAnewButton;

.m文件

//重写init方法,目的就是使得在按钮被初始化的时候就已经添加监听)addActionToButton方法

-(instancetype)initWithFrame:(CGRect)frame{

if (self=[super initWithFrame:frame]) {

    [self addTarget:self action:@selector(addActionToButton:) forControlEvents:UIControlEventTouchUpInside];

}

return self;

}

-(void)addActionToButton:(KLcustomBtn *)btn{

if (_block!=nil) {

_block(btn);

}

}

+(instancetype)createAnewButton{

returnreturn [KLcustomBtn buttonWithType:UIButtonTypeCustom];

}

调用的时候

KLcustomBtn *btn =[KLcustomBtn createAnewButton];

btn.block =^(KLcustomBtn *btn){

//代码

};

同样适用于传递参数

二、代理协议

.h文件

@protocol customBtnDelegate

@optional

-(void)pleaseObeydelegate:(KLcustomBtn *)btn;

@end

@interface KLcustomBtn : UIButton

@property (nonatomic, weak) id delegate;

@end

.m文件

//如果btn想告诉别的控制器一些事情,就在那个方法中加入

if ([self.delegate respondsToSelector:@selector(pleaseObeydelegate:)]) {

[self.delegate pleaseObeydelegate:self];

}

//在目标控制器中的.m文件中遵守协议

KLcustomBtn *btn =[[KLcustomBtn alloc]init];

btn.delegate =self;

//再实现代理方法

-(void)pleaseObeydelegate:(KLcustomBtn *)btn{

NSLog(@“—————————————”);

}

三、GCD单例

利用线程进行最简单的单例创建

.h文件提供这样一个方法,以创建一个Button为例

+(instancetype)shareCustomBtn;

.m文件中这样来写

1.定义全局静态static id instance

2.重写allocWithZone方法

+(instancetype)allocWithZone:(struct _NSZone *)zone{

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

instance =[super allocWithZone:zone];//保证只执行一次

});

return instance;

}

3.实现方法

+(instancetype)shareCustomBtn{

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

instance =[[self alloc] init];

});

return instance;

}

最后调用这个对象,创建出来的就是指向同一内存地址的对象了。

posted @ 2018-08-06 13:23  信仰在天空下飘扬  阅读(193)  评论(0编辑  收藏  举报