美文网首页
给分类间接添加成员变量及使用场景

给分类间接添加成员变量及使用场景

作者: Jason_风筝 | 来源:发表于2018-11-01 09:57 被阅读0次
我们都知道默认情况下, 因分类底层结构的限制,  是不能添加成员变量到分类中. 但可以利用runtime 关联对象来间接实现.

下面我们来写一个分类, 关联一个属性, 及使用. 其实说到底, 关联一个属性就是为了方便调用.

给AppDelegate写一个分类, 目的是监听 AppDelegate 在前台还是后台.

#import "AppDelegate.h"

#import  <objc/runtime.h>

@interfaceAppDelegate (Push)

/// 生成setter/getter 声明

@property(nonatomic,strong) NSNumber* applicationInBackground;

@end

@implementation AppDelegate (Push)

// 利用runtime 交换方法

+ (void)load {

    Method original =class_getInstanceMethod(self,@selector(application:didFinishLaunchingWithOptions:));

    Method swizzled =class_getInstanceMethod(self,@selector(application:swizzledDidFinishLaunchingWithOptions:));

    method_exchangeImplementations(original, swizzled);

}

///实现set 方法

// 参数1: 要给谁关联对象     

// 参数2: 储存值对应的key ,因为它底层也key-value 的形式存值的. 这里说一下这个key, 因为get时是根据key get value. 所以比较好的做法可以把 @selector(applicationInBackground) 储存地址当key     

// 参数3: 储存值     

// 参数4: 相当于property中的类型, 对象类型Strong , 基本类型用 assign, 注意里面的宏.     

//objc_setAssociatedObject(id _Nonnull object, const void * _Nonnull key,  id _Nullable value, objc_AssociationPolicy policy)

- (void)setApplicationInBackground:(NSNumber *)applicationInBackground {     

    objc_setAssociatedObject(self, @selector(applicationInBackground), applicationInBackground, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 

}

/// 实现get 方法 

- (NSNumber*)applicationInBackground {

    /// 注意保持key 相同

    return objc_getAssociatedObject(self,@selector(applicationInBackground));

}



- (BOOL)application:(UIApplication*)application swizzledDidFinishLaunchingWithOptions:(NSDictionary*)launchOptions {

    // 调用原始的方法

    [self application:application swizzledDidFinishLaunchingWithOptions:launchOptions];

    // 给属性赋值

    self.applicationInBackground = @(YES);

    return YES;

}

- (void)applicationDidBecomeActive:(UIApplication*)application {

    self.applicationInBackground = @(NO);

}

- (void)applicationDidEnterBackground:(UIApplication*)application {

    self.applicationInBackground = @(YES);

}

// 赋张类型修饰选择图


1.png

到此, 外界只要导入它, 根据 applicationInBackground 就可以知道是在前台还是在后台.

这就是给分类关联一个属性的简便使用.

相关文章

  • 分类中关联对象实现

    前言: 分类中虽然不能直接添加成员变量,但是我们可以通过间接实现添加成员变量 方法一:使用静态全局变量给分类添加属...

  • 关联对象

    分类里面添加成员变量, 分类里面是不能直接添加成员变量的,但是可以通过runtime间接添加成员变量。 为什么...

  • 给分类间接添加成员变量及使用场景

    下面我们来写一个分类, 关联一个属性, 及使用. 其实说到底, 关联一个属性就是为了方便调用. // 赋张类型修饰...

  • iOS关联对象的底层实现

    分类不能直接添加成员变量,可以通过关联对象间接达到添加成员变量的效果,不能添加成员变量是由于分类的底层结构体是这样...

  • OC语言之category_关联对象的本质源码解析

    关联对象 能否给分类添加"成员变量"? 使用关联对象技术为分类添加"成员变量" 关联对象添加的"成员变量"添加到了...

  • Category能否添加成员变量,如果可以,如何添加?

    不能直接给category添加成员变量,但是可以间接实现category有成员变量的效果 方法一:可以给分类添加字...

  • iOS底层day5 - 探索对象关联

    Q: 分类可以添加成员变量吗 分类不可以直接添加成员变量,但是可以间接添加在类中声明一个属性的时候,编译器会帮我们...

  • iOS底层学习:类的扩展和关联对象

    类的扩展和分类 category:分类、类别 给类增加方法 不能添加成员变量 可以使用runtime给分类添加属性...

  • Category场景、继承与多态

    实例变量 = 成员变量 = ivar category使用场景 为源码文件添加方法 按功能进行分类,放到多个文件中...

  • Category-关联对象

    分类添加属性 Category能否添加成员变量?如果可以,如何给Category添加成员变量?不能直接给Categ...

网友评论

      本文标题:给分类间接添加成员变量及使用场景

      本文链接:https://www.haomeiwen.com/subject/vrutxqtx.html