为某个对象设置关联对象的值:
void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy)
// 第一个参数是主对象,第二个参数是键,第三个参数是关联的对象,第四个参数是存储策略:是枚举,定义了内存管理语义。
根据给定的键从某对象中获取相应的关联对象值:
id objc_getAssociatedObject(id object, void *key)
移除指定对象的关联对象:
void objc_removeAssociatedObjects(id object)
#import <objc/runtime.h>
static void *EOCMyAlertViewKey = "EOCMyAlertViewKey";
- (void)askUserAQuestion {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Question"
message:@"What do you want to do?"
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"Continue", nil];
void (^block)(NSInteger) = ^(NSInteger buttonIndex){
if (buttonIndex == 0) {
[self doCancel];
} else {
[self doContinue];
}
};
//将alert和block关联在了一起
objc_setAssociatedObject(alert,EOCMyAlertViewKey,block, OBJC_ASSOCIATION_COPY);
[alert show];
}
// UIAlertViewDelegate protocol method
- (void)alertView:(UIAlertView*)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
//alert取出关联的block
void (^block)(NSInteger) = objc_getAssociatedObject(alertView, EOCMyAlertViewKey)
//给block传入index值
block(buttonIndex);
}
注:id value 必须为对象!!!
- (void)setWlt_disableGoBackInteractive:(BOOL)wlt_disableGoBackInteractive {
objc_setAssociatedObject(self, @selector(wlt_disableGoBackInteractive), @(wlt_disableGoBackInteractive), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (BOOL)wlt_disableGoBackInteractive {
return [objc_getAssociatedObject(self, _cmd) boolValue];
}
注:key可以用_cmd,相当于"wlt_navDelegate"-入参的字符串
- (void)setWlt_navDelegate:(WLNavigationControllerDelegate *)wlt_navDelegate {
objc_setAssociatedObject(self, @selector(wlt_navDelegate), wlt_navDelegate, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (WLNavigationControllerDelegate *)wlt_navDelegate {
return objc_getAssociatedObject(self, _cmd);
}
网友评论