- UIAlertView的扩展
.h文件
#import <UIKit/UIKit.h>
typedef void (^successBlock)(NSInteger buttonIndex);
@interface UIAlertView (Block)<UIAlertViewDelegate>
- (void)showWithBlock:(successBlock)block;
@end
.m文件
#import "UIAlertView+Block.h"
#import <objc/runtime.h>
static const char alertKey;
@implementation UIAlertView (Block)
- (void)showWithBlock:(successBlock)block
{
if (block)
{
objc_setAssociatedObject(self, &alertKey, block, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
self.delegate = self;
}
[self show];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
successBlock block = objc_getAssociatedObject(self, &alertKey);
block(buttonIndex);
}
@end
- UIButton的扩展
.h文件
#import <UIKit/UIKit.h>
typedef void (^btnBlock)();
@interface UIButton (Block)
- (void)handelWithBlock:(btnBlock)block;
@end
.m文件
#import "UIButton+Block.h"
#import <objc/runtime.h>
static const char btnKey;
@implementation UIButton (Block)
- (void)handelWithBlock:(btnBlock)block
{
if (block)
{
objc_setAssociatedObject(self, &btnKey, block, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
[self addTarget:self action:@selector(btnAction) forControlEvents:UIControlEventTouchUpInside];
}
- (void)btnAction
{
btnBlock block = objc_getAssociatedObject(self, &btnKey);
block();
}
@end
tips: 使用objc_setAssociatedObject,需要引入头文件
#import <objc/runtime.h>
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);id objc_getAssociatedObject(id object, const void *key);
这两个方法可以让一个对象和另一个对象关联,就是说一个对象可以保持对另一个对象的引用,并获取那个对象。有了这些,就能实现属性功能了。 policy可以设置为以下这些值:
enum {OBJC_ASSOCIATION_ASSIGN = 0,
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,
OBJC_ASSOCIATION_COPY_NONATOMIC = 3,
OBJC_ASSOCIATION_RETAIN = 01
OBJC_ASSOCIATION_COPY = 01403
};
网友评论
比如
#import <UIKit/UIKit.h>
@class CustomView;
@interface UICollectionView (Custom)
@property(nonatomic,weak)CustomView *view;
#pragma mark-关联头部
-(void)setHeader:(CustomView *)header
{
objc_setAssociatedObject(self, @selector(header), header, OBJC_ASSOCIATION_ASSIGN);
}
- (CustomView *)header
{
return objc_getAssociatedObject(self, @selector(header));
}
#import <objc/objc-runtime.h>
里面包含了
#include <objc/runtime.h>
#include <objc/message.h>
和单独的用 #include <objc/runtime.h>有区别吗?我看有的人用前者啊!?