NSObject+BBARuntime.h 3.29 KB
//
//  NSObject+BBARuntime.h
//  BBAPods
//
//  Created by guojin on 16/5/17.
//  Copyright © 2016年 Baidu. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "BDPFoundationDefines.h"

/**
 * 运行时的基本方法,包括 bba_respondsToSelector 和 MethodSwizzling
 * 详细介绍请看README-BBARuntime
 */

@interface NSObject (BBARuntime)

/**
 * @brief 当前类(而非父类)是否实现了Selector
 *
 * @param selector 方法
 * @return BOOL
 */
- (BOOL)bba_respondsToSelector:(SEL)selector BDP_FOUNDATION_DEPRECATED("please use bdp_respondsToSelector:");
- (BOOL)bdp_respondsToSelector:(SEL)selector;

/**
 * @brief 动态执行指定selector方法,并指定对应的参数,若当前selector有返回值,该方法将返回对应的返回值;若没有,则返回nil
 *
 * @param selector 动态待执行的方法
 * @param params 待执行的方法所需的参数:
 1. 对于参数为基本类型的,通过NSNumber包装进行传递;
 2. 参数为CGRect、CGSize等结构体的,用NSValue包装传递;
 3. 对于原方法的参数需传递nil的case,通过NSNull进行传递;
 4. 对于参数为SEL类型的,通过NSStringFromSelector包装成一个NSString进行传递
 *
 * @return 该方法的返回值:
 1. 对于返回值为基本类型的,如:NSInteger、BOOL等,则会返回NSNumber对象;
 2. 对于返回值为CGSize、CGRect、CGPoint等结构体,则会返回NSValue对象;
 3. 对于返回值为SEL类型的,则会返回NSString对象,通过NSSelectorFromString解析出对应的SEL
 4. 对于无返回类型 和 无法正确提取出返回值的case,则返回nil
 */
+ (id)bba_dynamicPerformSelector:(SEL)selector withParams:(NSArray *)params BDP_FOUNDATION_DEPRECATED("please use bdp_dynamicPerformSelector:withParams:");
+ (id)bdp_dynamicPerformSelector:(SEL)selector withParams:(NSArray *)params;

- (id)bba_dynamicPerformSelector:(SEL)selector withParams:(NSArray *)params BDP_FOUNDATION_DEPRECATED("please use bdp_dynamicPerformSelector:withParams:");
- (id)bdp_dynamicPerformSelector:(SEL)selector withParams:(NSArray *)params;

/**
 * @brief 遍历当前对象所有的可读写属性名 (只遍历当前对象的类所定义的属性,而不会遍历其父类定义的属性)
 *
 * @param block 遍历回调
 */
+ (void)bba_enumerateRWProperty:(void(^)(NSString *pname))block BDP_FOUNDATION_DEPRECATED("please use bdp_enumerateRWProperty:");
+ (void)bdp_enumerateRWProperty:(void(^)(NSString *pname))block;

- (void)bba_enumerateRWProperty:(void(^)(NSString *pname))block BDP_FOUNDATION_DEPRECATED("please use bdp_enumerateRWProperty:");
- (void)bdp_enumerateRWProperty:(void(^)(NSString *pname))block;

@end


@interface BBARunTime : NSObject

/**
 * @brief MethodSwizzling 实例方法
 *
 * @param origCls hook的类
 * @param origSEL hook的方法
 * @param cls 替换的类
 * @param sel 替换的实例方法
 */
+ (void)replaceClass:(Class)origCls sel:(SEL)origSEL withClass:(Class)cls withSEL:(SEL)sel;

/**
 * @brief MethodSwizzling 方法
 *
 * @param origCls origCls hook的类
 * @param origSEL hook的方法
 * @param cls 替换的类
 * @param sel 替换的方法
 * @param isClassMethod YES 类方法 NO 实例方法
 */
+ (void)replaceClass:(Class)origCls sel:(SEL)origSEL withClass:(Class)cls withSEL:(SEL)sel isClassMethod:(BOOL)isClassMethod;

@end