Category關(guān)聯(lián)屬性
為一個對象設(shè)置關(guān)聯(lián)對象,實現(xiàn)為其添加屬性的效果,使用方法
objc_setAssociatedObject
objc_getAssociatedObject
UIView+LeoExtension.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface UIView (LeoExtension)
@property (copy,nonatomic)NSString * leo_anaylizeTitle;
@end
UIView+LeoExtension.m
#import "UIView+LeoExtension.h"
#import <objc/runtime.h>
static const char kAnaylizeTitle;
@implementation UIView (LeoExtension)
-(NSString *)leo_anaylizeTitle{
return objc_getAssociatedObject(self, &kAnaylizeTitle);
}
-(void)setLeo_anaylizeTitle:(NSString *)leo_anaylizeTitle{
objc_setAssociatedObject(self, &kAnaylizeTitle,leo_anaylizeTitle, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
@end
Method Swizzling
#import <objc/runtime.h>
@implementation UIViewController (Tracking)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class class = [self class];
SEL originalSelector = @selector(viewWillAppear:);
SEL swizzledSelector = @selector(xxx_viewWillAppear:);
Method originalMethod = class_getInstanceMethod(class, originalSelector);
Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
// When swizzling a class method, use the following:
// Class class = object_getClass((id)self);
// ...
// Method originalMethod = class_getClassMethod(class, originalSelector);
// Method swizzledMethod = class_getClassMethod(class, swizzledSelector);
BOOL didAddMethod =
class_addMethod(class,
originalSelector,
method_getImplementation(swizzledMethod),
method_getTypeEncoding(swizzledMethod));
if (didAddMethod) {
class_replaceMethod(class,
swizzledSelector,
method_getImplementation(originalMethod),
method_getTypeEncoding(originalMethod));
} else {
method_exchangeImplementations(originalMethod, swizzledMethod);
}
});
}
#pragma mark - Method Swizzling
- (void)xxx_viewWillAppear:(BOOL)animated {
[self xxx_viewWillAppear:animated];
NSLog(@"viewWillAppear: %@", self);
}
@end
交叉后的Runtime順序:
- 根據(jù)@selector(viewWillAppear:)找到自定義的xxx_viewWillAppear實現(xiàn)
- 自定義的xxx_viewWillAppear實現(xiàn),向Self發(fā)送@selector(xxx_viewWillAppear)
- 根據(jù)@selector(xxx_viewWillAppear),找到默認(rèn)的SDK中viewWillAppear的實現(xiàn)
- 執(zhí)行默認(rèn)SDK中viewWillAppear代碼
- 執(zhí)行NSLog(@"viewWillAppear: %@", self);
- 結(jié)束