NSObject(FWAppearance)

@interface NSObject (FWAppearance)

/// 从 appearance 里取值并赋值给当前实例,通常在对象的 init 里调用
- (void)fw_applyAppearance NS_REFINED_FOR_SWIFT;

@end
extension NSObject: WrapperCompatible

Undocumented

  • 从 appearance 里取值并赋值给当前实例,通常在对象的 init 里调用

    Declaration

    Objective-C

    - (void)fw_applyAppearance;

NSObject+FWSafeType

  • 是否是非Null(nil, NSNull)

    Declaration

    Objective-C

    @property (nonatomic, readonly) BOOL fw_isNotNull;

    Return Value

    如果为非Null返回YES,为Null返回NO

  • 是否是非空对象(nil, NSNull, count为0, length为0)

    Declaration

    Objective-C

    @property (nonatomic, readonly) BOOL fw_isNotEmpty;

    Return Value

    如果是非空对象返回YES,为空对象返回NO

  • 检测并安全转换为NSInteger

    Declaration

    Objective-C

    @property (nonatomic, readonly) NSInteger fw_safeInteger;

    Return Value

    NSInteger

  • 检测并安全转换为Float

    Declaration

    Objective-C

    @property (nonatomic, readonly) float fw_safeFloat;

    Return Value

    Float

  • 检测并安全转换为Double

    Declaration

    Objective-C

    @property (nonatomic, readonly) double fw_safeDouble;

    Return Value

    Double

  • 检测并安全转换为Bool

    Declaration

    Objective-C

    @property (nonatomic, readonly) BOOL fw_safeBool;

    Return Value

    Bool

  • 检测并安全转换为NSNumber

    Declaration

    Objective-C

    @property (nonatomic, strong, readonly) NS_REFINED_FOR_SWIFT NSNumber *fw_safeNumber;

    Return Value

    NSNumber

  • 检测并安全转换为NSString

    Declaration

    Objective-C

    @property (nonatomic, copy, readonly) NS_REFINED_FOR_SWIFT NSString *fw_safeString;

    Return Value

    NSString

  • 检测并安全转换为NSDate

    Declaration

    Objective-C

    @property (nonatomic, strong, readonly) NS_REFINED_FOR_SWIFT NSDate *fw_safeDate;

    Return Value

    NSDate

  • 检测并安全转换为NSData

    Declaration

    Objective-C

    @property (nonatomic, strong, readonly) NS_REFINED_FOR_SWIFT NSData *fw_safeData;

    Return Value

    NSData

  • 检测并安全转换为NSArray

    Declaration

    Objective-C

    @property (nonatomic, strong, readonly) NS_REFINED_FOR_SWIFT NSArray *fw_safeArray;

    Return Value

    NSArray

  • 检测并安全转换为NSMutableArray

    Declaration

    Objective-C

    @property (nonatomic, strong, readonly) NS_REFINED_FOR_SWIFT NSMutableArray *fw_safeMutableArray;

    Return Value

    NSMutableArray

  • 检测并安全转换为NSDictionary

    Declaration

    Objective-C

    @property (nonatomic, strong, readonly) NS_REFINED_FOR_SWIFT NSDictionary *fw_safeDictionary;

    Return Value

    NSDictionary

  • 检测并安全转换为NSMutableDictionary

    Declaration

    Objective-C

    @property (nonatomic, strong, readonly) NS_REFINED_FOR_SWIFT NSMutableDictionary *fw_safeMutableDictionary;

    Return Value

    NSMutableDictionary

NSObject+FWFoundation

  • 执行加锁(支持任意对象),等待信号量,自动创建信号量

    Declaration

    Objective-C

    - (void)fw_lock;
  • 执行解锁(支持任意对象),发送信号量,自动创建信号量

    Declaration

    Objective-C

    - (void)fw_unlock;

Observer

  • 监听某个点对点消息,对象释放时自动移除监听,添加多次执行多次

    Declaration

    Objective-C

    - (nonnull NSString *)
        fw_observeMessage:(nonnull NSNotificationName)name
                    block:(nonnull void (^)(NSNotification *_Nonnull))block;

    Parameters

    name

    消息名称

    block

    消息句柄

    Return Value

    监听唯一标志

  • 监听某个指定对象点对点消息,对象释放时自动移除监听,添加多次执行多次

    Declaration

    Objective-C

    - (nonnull NSString *)
        fw_observeMessage:(nonnull NSNotificationName)name
                   object:(nullable id)object
                    block:(nonnull void (^)(NSNotification *_Nonnull))block;

    Parameters

    name

    消息名称

    object

    消息对象,值为nil时表示所有

    block

    消息句柄

    Return Value

    监听唯一标志

  • 监听某个点对点消息,对象释放时自动移除监听,添加多次执行多次

    Declaration

    Objective-C

    - (nonnull NSString *)fw_observeMessage:(nonnull NSNotificationName)name
                                     target:(nullable id)target
                                     action:(nonnull SEL)action;

    Parameters

    name

    消息名称

    target

    消息目标

    action

    目标动作,参数为通知对象

    Return Value

    监听唯一标志

  • 监听某个指定对象点对点消息,对象释放时自动移除监听,添加多次执行多次

    Declaration

    Objective-C

    - (nonnull NSString *)fw_observeMessage:(nonnull NSNotificationName)name
                                     object:(nullable id)object
                                     target:(nullable id)target
                                     action:(nonnull SEL)action;

    Parameters

    name

    消息名称

    object

    消息对象,值为nil时表示所有

    target

    消息目标

    action

    目标动作,参数为通知对象

    Return Value

    监听唯一标志

  • 手工移除某个点对点消息指定监听

    Declaration

    Objective-C

    - (void)fw_unobserveMessage:(nonnull NSNotificationName)name
                         target:(nullable id)target
                         action:(nullable SEL)action;

    Parameters

    name

    消息名称

    target

    消息目标

    action

    目标动作

  • 手工移除某个指定对象点对点消息指定监听

    Declaration

    Objective-C

    - (void)fw_unobserveMessage:(nonnull NSNotificationName)name
                         object:(nullable id)object
                         target:(nullable id)target
                         action:(nullable SEL)action;

    Parameters

    name

    消息名称

    object

    消息对象,值为nil时表示所有

    target

    消息目标

    action

    目标动作

  • 手工移除某个指定对象点对点消息指定监听

    Declaration

    Objective-C

    - (void)fw_unobserveMessage:(nonnull NSNotificationName)name
                     identifier:(nonnull NSString *)identifier;

    Parameters

    name

    消息名称

    identifier

    监听唯一标志

  • 手工移除某个点对点消息所有监听

    Declaration

    Objective-C

    - (void)fw_unobserveMessage:(nonnull NSNotificationName)name;

    Parameters

    name

    消息名称

  • 手工移除某个指定对象点对点消息所有监听

    Declaration

    Objective-C

    - (void)fw_unobserveMessage:(nonnull NSNotificationName)name
                         object:(nullable id)object;

    Parameters

    name

    消息名称

    object

    消息对象,值为nil时表示所有

  • 手工移除所有点对点消息监听

    Declaration

    Objective-C

    - (void)fw_unobserveAllMessages;

Subject

  • 发送点对点消息

    Declaration

    Objective-C

    - (void)fw_sendMessage:(nonnull NSNotificationName)name
                toReceiver:(nonnull id)receiver;

    Parameters

    name

    消息名称

    receiver

    消息接收者

  • 发送点对点消息,附带对象

    Declaration

    Objective-C

    - (void)fw_sendMessage:(nonnull NSNotificationName)name
                    object:(nullable id)object
                toReceiver:(nonnull id)receiver;

    Parameters

    name

    消息名称

    object

    消息对象

    receiver

    消息接收者

  • 发送点对点消息,附带对象和用户信息

    Declaration

    Objective-C

    - (void)fw_sendMessage:(nonnull NSNotificationName)name
                    object:(nullable id)object
                  userInfo:(nullable NSDictionary *)userInfo
                toReceiver:(nonnull id)receiver;

    Parameters

    name

    消息名称

    object

    消息对象

    userInfo

    用户信息

    receiver

    消息接收者

  • 发送类点对点消息

    Declaration

    Objective-C

    + (void)fw_sendMessage:(nonnull NSNotificationName)name
                toReceiver:(nonnull id)receiver;

    Parameters

    name

    消息名称

    receiver

    消息接收者

  • 发送类点对点消息,附带对象

    Declaration

    Objective-C

    + (void)fw_sendMessage:(nonnull NSNotificationName)name
                    object:(nullable id)object
                toReceiver:(nonnull id)receiver;

    Parameters

    name

    消息名称

    object

    消息对象

    receiver

    消息接收者

  • 发送类点对点消息,附带对象和用户信息

    Declaration

    Objective-C

    + (void)fw_sendMessage:(nonnull NSNotificationName)name
                    object:(nullable id)object
                  userInfo:(nullable NSDictionary *)userInfo
                toReceiver:(nonnull id)receiver;

    Parameters

    name

    消息名称

    object

    消息对象

    userInfo

    用户信息

    receiver

    消息接收者

Observer

  • 监听某个广播通知,对象释放时自动移除监听,添加多次执行多次

    Declaration

    Objective-C

    - (nonnull NSString *)
        fw_observeNotification:(nonnull NSNotificationName)name
                         block:(nonnull void (^)(NSNotification *_Nonnull))block;

    Parameters

    name

    通知名称

    block

    通知句柄

    Return Value

    监听唯一标志

  • 监听某个指定对象广播通知,对象释放时自动移除监听,添加多次执行多次

    Declaration

    Objective-C

    - (nonnull NSString *)
        fw_observeNotification:(nonnull NSNotificationName)name
                        object:(nullable id)object
                         block:(nonnull void (^)(NSNotification *_Nonnull))block;

    Parameters

    name

    通知名称

    object

    通知对象,值为nil时表示所有

    block

    通知句柄

    Return Value

    监听唯一标志

  • 监听某个广播通知,对象释放时自动移除监听,添加多次执行多次

    Declaration

    Objective-C

    - (nonnull NSString *)fw_observeNotification:(nonnull NSNotificationName)name
                                          target:(nullable id)target
                                          action:(nonnull SEL)action;

    Parameters

    name

    通知名称

    target

    通知目标

    action

    目标动作,参数为通知对象

    Return Value

    监听唯一标志

  • 监听某个指定对象广播通知,对象释放时自动移除监听,添加多次执行多次

    Declaration

    Objective-C

    - (nonnull NSString *)fw_observeNotification:(nonnull NSNotificationName)name
                                          object:(nullable id)object
                                          target:(nullable id)target
                                          action:(nonnull SEL)action;

    Parameters

    name

    通知名称

    object

    通知对象,值为nil时表示所有

    target

    通知目标

    action

    目标动作,参数为通知对象

    Return Value

    监听唯一标志

  • 手工移除某个广播通知指定监听

    Declaration

    Objective-C

    - (void)fw_unobserveNotification:(nonnull NSNotificationName)name
                              target:(nullable id)target
                              action:(nullable SEL)action;

    Parameters

    name

    通知名称

    target

    通知目标

    action

    目标动作

  • 手工移除某个指定对象广播通知指定监听

    Declaration

    Objective-C

    - (void)fw_unobserveNotification:(nonnull NSNotificationName)name
                              object:(nullable id)object
                              target:(nullable id)target
                              action:(nullable SEL)action;

    Parameters

    name

    通知名称

    object

    通知对象,值为nil时表示所有

    target

    通知目标

    action

    目标动作

  • 手工移除某个指定对象广播通知指定监听

    Declaration

    Objective-C

    - (void)fw_unobserveNotification:(nonnull NSNotificationName)name
                          identifier:(nonnull NSString *)identifier;

    Parameters

    name

    通知名称

    identifier

    监听唯一标志

  • 手工移除某个广播通知所有监听

    Declaration

    Objective-C

    - (void)fw_unobserveNotification:(nonnull NSNotificationName)name;

    Parameters

    name

    通知名称

  • 手工移除某个指定对象广播通知所有监听

    Declaration

    Objective-C

    - (void)fw_unobserveNotification:(nonnull NSNotificationName)name
                              object:(nullable id)object;

    Parameters

    name

    通知名称

    object

    通知对象,值为nil时表示所有

  • 手工移除所有广播通知监听

    Declaration

    Objective-C

    - (void)fw_unobserveAllNotifications;

Subject

  • 发送广播通知

    Declaration

    Objective-C

    - (void)fw_postNotification:(nonnull NSNotificationName)name;

    Parameters

    name

    通知名称

  • 发送广播通知,附带对象

    Declaration

    Objective-C

    - (void)fw_postNotification:(nonnull NSNotificationName)name
                         object:(nullable id)object;

    Parameters

    name

    通知名称

    object

    通知对象

  • 发送广播通知,附带对象和用户信息

    Declaration

    Objective-C

    - (void)fw_postNotification:(nonnull NSNotificationName)name
                         object:(nullable id)object
                       userInfo:(nullable NSDictionary *)userInfo;

    Parameters

    name

    通知名称

    object

    通知对象

    userInfo

    用户信息

  • 发送广播通知

    Declaration

    Objective-C

    + (void)fw_postNotification:(nonnull NSNotificationName)name;

    Parameters

    name

    通知名称

  • 发送广播通知,附带对象

    Declaration

    Objective-C

    + (void)fw_postNotification:(nonnull NSNotificationName)name
                         object:(nullable id)object;

    Parameters

    name

    通知名称

    object

    通知对象

  • 发送广播通知,附带对象和用户信息

    Declaration

    Objective-C

    + (void)fw_postNotification:(nonnull NSNotificationName)name
                         object:(nullable id)object
                       userInfo:(nullable NSDictionary *)userInfo;

    Parameters

    name

    通知名称

    object

    通知对象

    userInfo

    用户信息

NSObject+FWKvo

  • 监听对象某个属性,对象释放时自动移除监听,添加多次执行多次

    Declaration

    Objective-C

    - (nonnull NSString *)
        fw_observeProperty:(nonnull NSString *)property
                     block:
                         (nonnull void (^)(
                             id _Nonnull,
                             NSDictionary<NSKeyValueChangeKey, id> *_Nonnull))block;

    Parameters

    property

    属性名称

    block

    目标句柄,block参数依次为object、优化的change字典(不含NSNull)

    Return Value

    监听唯一标志

  • 监听对象某个属性,对象释放时自动移除监听,添加多次执行多次

    Declaration

    Objective-C

    - (nonnull NSString *)fw_observeProperty:(nonnull NSString *)property
                                      target:(nullable id)target
                                      action:(nonnull SEL)action;

    Parameters

    property

    属性名称

    target

    目标对象

    action

    目标动作,action参数依次为object、优化的change字典(不含NSNull)

    Return Value

    监听唯一标志

  • 手工移除某个属性指定监听

    Declaration

    Objective-C

    - (void)fw_unobserveProperty:(nonnull NSString *)property
                          target:(nullable id)target
                          action:(nullable SEL)action;

    Parameters

    property

    属性名称

    target

    目标对象,值为nil时移除所有对象(同UIControl)

    action

    目标动作,值为nil时移除所有动作(同UIControl)

  • 手工移除某个属性指定监听

    Declaration

    Objective-C

    - (void)fw_unobserveProperty:(nonnull NSString *)property
                      identifier:(nonnull NSString *)identifier;

    Parameters

    property

    属性名称

    identifier

    监听唯一标志

  • 手工移除某个属性所有监听

    Declaration

    Objective-C

    - (void)fw_unobserveProperty:(nonnull NSString *)property;

    Parameters

    property

    属性名称

  • 手工移除所有属性所有监听

    Declaration

    Objective-C

    - (void)fw_unobserveAllProperties;

NSObject+FWSwizzle

  • 使用swizzle替换对象实例方法为block实现,identifier相同时仅执行一次。结合fwIsSwizzleMethod使用

    Declaration

    Objective-C

    - (BOOL)fw_swizzleInstanceMethod:(nonnull SEL)originalSelector
                          identifier:(nonnull NSString *)identifier
                           withBlock:(nonnull id _Nonnull (^)(
                                         Class _Nonnull, SEL _Nonnull,
                                         IMP _Nonnull (^_Nonnull)(void)))block;

    Parameters

    originalSelector

    原始方法

    identifier

    唯一标识

    block

    实现句柄

    Return Value

    是否成功

  • 判断对象是否使用swizzle替换过指定identifier实例方法。结合fwSwizzleMethod使用

    Note

    因为实际替换的是类方法,为了防止影响该类其它对象,需先判断该对象是否替换过,仅替换过才执行自定义流程

    Declaration

    Objective-C

    - (BOOL)fw_isSwizzleInstanceMethod:(nonnull SEL)originalSelector
                            identifier:(nonnull NSString *)identifier;

    Parameters

    originalSelector

    原始方法

    identifier

    唯一标识

    Return Value

    是否替换

Runtime

  • 安全调用方法,如果不能响应,则忽略之

    Declaration

    Objective-C

    - (nullable id)fw_invokeMethod:(nonnull SEL)aSelector;

    Parameters

    aSelector

    要执行的方法

    Return Value

    id 方法执行后返回的值。如果无返回值,则为nil

  • 安全调用方法,如果不能响应,则忽略之

    Declaration

    Objective-C

    - (nullable id)fw_invokeMethod:(nonnull SEL)aSelector
                        withObject:(nullable id)object;

    Parameters

    aSelector

    要执行的方法

    object

    传递的方法参数,非id类型可使用桥接,如int a = 1;(__bridge id)(void *)a

    Return Value

    id 方法执行后返回的值。如果无返回值,则为nil

  • 安全调用方法,支持多个参数

    Declaration

    Objective-C

    - (nullable id)fw_invokeMethod:(nonnull SEL)aSelector
                       withObjects:(nonnull NSArray *)objects;

    Parameters

    aSelector

    要执行的方法

    objects

    传递的参数数组

    Return Value

    id 方法执行后返回的值。如果无返回值,则为nil

  • 对super发送消息

    Declaration

    Objective-C

    - (nullable id)fw_invokeSuperMethod:(nonnull SEL)aSelector;

    Parameters

    aSelector

    要执行的方法,需返回id类型

    Return Value

    id 方法执行后返回的值

  • 对super发送消息,可传递参数

    Declaration

    Objective-C

    - (nullable id)fw_invokeSuperMethod:(nonnull SEL)aSelector
                             withObject:(nullable id)object;

    Parameters

    aSelector

    要执行的方法,需返回id类型

    object

    传递的方法参数

    Return Value

    id 方法执行后返回的值

  • 安全调用内部属性获取方法,如果属性不存在,则忽略之

    Note

    如果iOS13系统UIView调用部分valueForKey:方法闪退,且没有好的替代方案,可尝试调用此方法

    Declaration

    Objective-C

    - (nullable id)fw_invokeGetter:(nonnull NSString *)name;

    Parameters

    name

    内部属性名称

    Return Value

    属性值

  • 安全调用内部属性设置方法,如果属性不存在,则忽略之

    Note

    如果iOS13系统UIView调用部分valueForKey:方法闪退,且没有好的替代方案,可尝试调用此方法

    Declaration

    Objective-C

    - (nullable id)fw_invokeSetter:(nonnull NSString *)name
                        withObject:(nullable id)object;

    Parameters

    name

    内部属性名称

    object

    传递的方法参数

    Return Value

    方法执行后返回的值

Property

  • 临时对象,强引用,支持KVO

    Note

    备注:key的几种形式的声明和使用,下同
    1. 声明:static char kAssociatedObjectKey; 使用:&kAssociatedObjectKey
    2. 声明:static void *kAssociatedObjectKey = &kAssociatedObjectKey; 使用:kAssociatedObjectKey
    3. 声明和使用直接用getter方法的selector,如@selector(xxx)、_cmd
    4. 声明和使用直接用c字符串,如"kAssociatedObjectKey"

    Declaration

    Objective-C

    @property (nonatomic, strong, nullable) id fw_tempObject;
  • 读取关联属性

    Declaration

    Objective-C

    - (nullable id)fw_propertyForName:(nonnull NSString *)name;

    Parameters

    name

    属性名称

    Return Value

    属性值

  • 设置强关联属性,支持KVO

    Declaration

    Objective-C

    - (void)fw_setProperty:(nullable id)object forName:(nonnull NSString *)name;

    Parameters

    object

    属性值

    name

    属性名称

  • 设置赋值关联属性,支持KVO,注意可能会产生野指针

    Declaration

    Objective-C

    - (void)fw_setPropertyAssign:(nullable id)object
                         forName:(nonnull NSString *)name;

    Parameters

    object

    属性值

    name

    属性名称

  • 设置拷贝关联属性,支持KVO

    Declaration

    Objective-C

    - (void)fw_setPropertyCopy:(nullable id)object forName:(nonnull NSString *)name;

    Parameters

    object

    属性值

    name

    属性名称

  • 设置弱引用关联属性,支持KVO,OC不支持weak关联属性

    Declaration

    Objective-C

    - (void)fw_setPropertyWeak:(nullable id)object forName:(nonnull NSString *)name;

    Parameters

    object

    属性值

    name

    属性名称

Bind

  • 给对象绑定上另一个对象以供后续取出使用,如果 object 传入 nil 则会清除该 key 之前绑定的对象

    Declaration

    Objective-C

    - (void)fw_bindObject:(nullable id)object forKey:(nonnull NSString *)key;

    Parameters

    object

    对象,会被 strong 强引用

    key

    键名

  • 给对象绑定上另一个弱引用对象以供后续取出使用,如果 object 传入 nil 则会清除该 key 之前绑定的对象

    Declaration

    Objective-C

    - (void)fw_bindObjectWeak:(nullable id)object forKey:(nonnull NSString *)key;

    Parameters

    object

    对象,不会被 strong 强引用

    key

    键名

  • 取出之前使用 bind 方法绑定的对象

    Declaration

    Objective-C

    - (nullable id)fw_boundObjectForKey:(nonnull NSString *)key;

    Parameters

    key

    键名

  • 给对象绑定上一个 double 值以供后续取出使用

    Declaration

    Objective-C

    - (void)fw_bindDouble:(double)doubleValue forKey:(nonnull NSString *)key;

    Parameters

    doubleValue

    double值

    key

    键名

  • 取出之前用 bindDouble:forKey: 绑定的值

    Declaration

    Objective-C

    - (double)fw_boundDoubleForKey:(nonnull NSString *)key;

    Parameters

    key

    键名

  • 给对象绑定上一个 BOOL 值以供后续取出使用

    Declaration

    Objective-C

    - (void)fw_bindBool:(BOOL)boolValue forKey:(nonnull NSString *)key;

    Parameters

    boolValue

    布尔值

    key

    键名

  • 取出之前用 bindBool:forKey: 绑定的值

    Declaration

    Objective-C

    - (BOOL)fw_boundBoolForKey:(nonnull NSString *)key;

    Parameters

    key

    键名

  • 给对象绑定上一个 NSInteger 值以供后续取出使用

    Declaration

    Objective-C

    - (void)fw_bindInt:(NSInteger)integerValue forKey:(nonnull NSString *)key;

    Parameters

    integerValue

    整数值

    key

    键名

  • 取出之前用 bindInt:forKey: 绑定的值

    Declaration

    Objective-C

    - (NSInteger)fw_boundIntForKey:(nonnull NSString *)key;

    Parameters

    key

    键名

  • 移除之前使用 bind 方法绑定的对象

    Declaration

    Objective-C

    - (void)fw_removeBindingForKey:(nonnull NSString *)key;

    Parameters

    key

    键名

  • 移除之前使用 bind 方法绑定的所有对象

    Declaration

    Objective-C

    - (void)fw_removeAllBindings;
  • 返回当前有绑定对象存在的所有的 key 的数组,数组中元素的顺序是随机的,如果不存在任何 key,则返回一个空数组

    Declaration

    Objective-C

    - (nonnull NSArray<NSString *> *)fw_allBindingKeys;
  • 返回是否设置了某个 key

    Declaration

    Objective-C

    - (BOOL)fw_hasBindingKey:(nonnull NSString *)key;

    Parameters

    key

    键名

Exchange

  • 交换类实例方法。复杂情况可能会冲突

    Declaration

    Objective-C

    + (BOOL)fw_exchangeInstanceMethod:(nonnull SEL)originalSelector
                        swizzleMethod:(nonnull SEL)swizzleSelector;

    Parameters

    originalSelector

    原始方法

    swizzleSelector

    交换方法

    Return Value

    是否成功

  • 交换类静态方法。复杂情况可能会冲突

    Declaration

    Objective-C

    + (BOOL)fw_exchangeClassMethod:(nonnull SEL)originalSelector
                     swizzleMethod:(nonnull SEL)swizzleSelector;

    Parameters

    originalSelector

    原始方法

    swizzleSelector

    交换方法

    Return Value

    是否成功

  • 交换类实例方法为block实现。复杂情况可能会冲突

    Note

    swizzleBlock示例:^(__unsafe_unretained UIViewController selfObject, BOOL animated){ ((void()(id, SEL, BOOL))objc_msgSend)(selfObject, swizzleSelector, animated); }

    Declaration

    Objective-C

    + (BOOL)fw_exchangeInstanceMethod:(nonnull SEL)originalSelector
                        swizzleMethod:(nonnull SEL)swizzleSelector
                            withBlock:(nonnull id)swizzleBlock;

    Parameters

    originalSelector

    原始方法

    swizzleSelector

    交换方法

    swizzleBlock

    实现block

    Return Value

    是否成功

  • 交换类静态方法为block实现。复杂情况可能会冲突

    Note

    swizzleBlock示例:^(__unsafe_unretained Class selfClass, BOOL animated){ ((void(*)(id, SEL, BOOL))objc_msgSend)(selfClass, swizzleSelector, animated); }

    Declaration

    Objective-C

    + (BOOL)fw_exchangeClassMethod:(nonnull SEL)originalSelector
                     swizzleMethod:(nonnull SEL)swizzleSelector
                         withBlock:(nonnull id)swizzleBlock;

    Parameters

    originalSelector

    原始方法

    swizzleSelector

    交换方法

    swizzleBlock

    实现block

    Return Value

    是否成功

  • 生成原始方法对应的随机交换方法

    Declaration

    Objective-C

    + (nonnull SEL)fw_exchangeSwizzleSelector:(nonnull SEL)selector;

    Parameters

    selector

    原始方法

    Return Value

    交换方法

Swizzle

  • 通用swizzle替换方法为block实现,支持类和对象,identifier有值且相同时仅执行一次。复杂情况不会冲突,推荐使用

    Declaration

    Objective-C

    + (BOOL)fw_swizzleMethod:(nullable id)target
                    selector:(nonnull SEL)originalSelector
                  identifier:(nullable NSString *)identifier
                   withBlock:(nonnull id _Nonnull (^)(
                                 Class _Nonnull, SEL _Nonnull,
                                 IMP _Nonnull (^_Nonnull)(void)))block;

    Parameters

    target

    目标类或对象

    originalSelector

    原始方法

    identifier

    唯一标识,有值且相同时仅执行一次

    block

    实现句柄

    Return Value

    是否成功

  • 使用swizzle替换类实例方法为block实现。复杂情况不会冲突,推荐使用

    Note

    Swift实现代码示例: NSObject.fw.swizzleInstanceMethod(UIViewController.self, selector: NSSelectorFromString(“viewDidLoad”)) { targetClass, originalCMD, originalIMP in let swizzleIMP: @convention(block)(UIViewController) -> Void = { selfObject in typealias originalMSGType = @convention©(UIViewController, Selector) -> Void let originalMSG: originalMSGType = unsafeBitCast(originalIMP(), to: originalMSGType.self) originalMSG(selfObject, originalCMD)

        // ...
    }
    return unsafeBitCast(swizzleIMP, to: AnyObject.self)
    

    }

    Declaration

    Objective-C

    + (BOOL)fw_swizzleInstanceMethod:(nonnull Class)originalClass
                            selector:(nonnull SEL)originalSelector
                           withBlock:(nonnull id _Nonnull (^)(
                                         Class _Nonnull, SEL _Nonnull,
                                         IMP _Nonnull (^_Nonnull)(void)))block;

    Parameters

    originalClass

    原始类

    originalSelector

    原始方法

    block

    实现句柄

    Return Value

    是否成功

  • 使用swizzle替换类静态方法为block实现。复杂情况不会冲突,推荐使用

    Declaration

    Objective-C

    + (BOOL)fw_swizzleClassMethod:(nonnull Class)originalClass
                         selector:(nonnull SEL)originalSelector
                        withBlock:(nonnull id _Nonnull (^)(
                                      Class _Nonnull, SEL _Nonnull,
                                      IMP _Nonnull (^_Nonnull)(void)))block;

    Parameters

    originalClass

    原始类

    originalSelector

    原始方法

    block

    实现句柄

    Return Value

    是否成功

  • 使用swizzle替换类实例方法为block实现,identifier相同时仅执行一次。复杂情况不会冲突,推荐使用

    Declaration

    Objective-C

    + (BOOL)fw_swizzleInstanceMethod:(nonnull Class)originalClass
                            selector:(nonnull SEL)originalSelector
                          identifier:(nonnull NSString *)identifier
                           withBlock:(nonnull id _Nonnull (^)(
                                         Class _Nonnull, SEL _Nonnull,
                                         IMP _Nonnull (^_Nonnull)(void)))block;

    Parameters

    originalClass

    原始类

    originalSelector

    原始方法

    identifier

    唯一标识

    block

    实现句柄

    Return Value

    是否成功

  • 使用swizzle替换类静态方法为block实现,identifier相同时仅执行一次。复杂情况不会冲突,推荐使用

    Declaration

    Objective-C

    + (BOOL)fw_swizzleClassMethod:(nonnull Class)originalClass
                         selector:(nonnull SEL)originalSelector
                       identifier:(nonnull NSString *)identifier
                        withBlock:(nonnull id _Nonnull (^)(
                                      Class _Nonnull, SEL _Nonnull,
                                      IMP _Nonnull (^_Nonnull)(void)))block;

    Parameters

    originalClass

    原始类

    originalSelector

    原始方法

    identifier

    唯一标识

    block

    实现句柄

    Return Value

    是否成功

Class

  • 获取类方法列表,自动缓存,支持meta类(objc_getMetaClass)

    Declaration

    Objective-C

    + (nonnull NSArray<NSString *> *)fw_classMethods:(nonnull Class)clazz
                                          superclass:(BOOL)superclass;

    Parameters

    clazz

    指定类

    superclass

    是否包含父类,包含则递归到NSObject

    Return Value

    方法列表

  • 获取类属性列表,自动缓存,支持meta类(objc_getMetaClass)

    Declaration

    Objective-C

    + (nonnull NSArray<NSString *> *)fw_classProperties:(nonnull Class)clazz
                                             superclass:(BOOL)superclass;

    Parameters

    clazz

    指定类

    superclass

    是否包含父类,包含则递归到NSObject

    Return Value

    属性列表

  • 获取类Ivar列表,自动缓存,支持meta类(objc_getMetaClass)

    Declaration

    Objective-C

    + (nonnull NSArray<NSString *> *)fw_classIvars:(nonnull Class)clazz
                                        superclass:(BOOL)superclass;

    Parameters

    clazz

    指定类

    superclass

    是否包含父类,包含则递归到NSObject

    Return Value

    Ivar列表

NSObject+FWTheme

  • 订阅主题通知并指定主题上下文(如vc|view),非UITraitEnvironment等需指定后才能响应系统主题

    Declaration

    Objective-C

    @property (nonatomic, weak, nullable) id<UITraitEnvironment> fw_themeContext;
  • 添加iOS13主题改变通知回调,返回订阅唯一标志,需订阅后才生效

    Declaration

    Objective-C

    - (nullable NSString *)fw_addThemeListener:
        (nonnull void (^)(FWThemeStyle))listener;
  • iOS13根据订阅唯一标志移除主题通知回调

    Declaration

    Objective-C

    - (void)fw_removeThemeListener:(nullable NSString *)identifier;
  • iOS13移除所有主题通知回调,一般用于cell重用

    Declaration

    Objective-C

    - (void)fw_removeAllThemeListeners;
  • iOS13主题改变包装器钩子,如果父类有重写,记得调用super,需订阅后才生效

    Declaration

    Objective-C

    - (void)fw_themeChanged:(FWThemeStyle)style;