ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【iOS】——分类,扩展以及关联对象 [打印本页]

作者: 用多少眼泪才能让你相信    时间: 2024-8-18 20:45
标题: 【iOS】——分类,扩展以及关联对象
1. 分类(Category)和扩展(Extension)

1) 分类(运行期)


2)扩展(编译期)


3)区别


2. 分类的实质

1)分类原理

  1. typedef struct category_t *Category;
  2. struct category_t {
  3.     const char *name; // 分类名
  4.     classref_t cls; // 类
  5.     struct method_list_t *instanceMethods;  // 实例方法
  6.     struct method_list_t *classMethods; // 类方法
  7.     struct protocol_list_t *protocols;  // 协议
  8.     struct property_list_t *instanceProperties; // 实例属性
  9.     // Fields below this point are not always present on disk.
  10.     struct property_list_t *_classProperties;   // 类属性
  11.     method_list_t *methodsForMeta(bool isMeta) {
  12.         if (isMeta) return classMethods;
  13.         else return instanceMethods;
  14.     }
  15.     property_list_t *propertiesForMeta(bool isMeta, struct header_info *hi);
  16. };
复制代码
发现里面存在实例方法列表,类方法列表,实例属性列表与类属性列表。
2)分类的加载流程

也就是说当分类中的方法与原始类中的方法重名时,会先去调用分类中实现的方法。
2. 关联对象

通过关联对象给分类添加属性
动态添加

  1. objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
复制代码

取值

  1. objc_getAssociatedObject(id object, const void *key);
复制代码

移除关联对象

  1. - (void)removeAssociatedObjects
  2. {
  3.     // 移除关联对象
  4.     objc_removeAssociatedObjects(self);
  5. }
复制代码
应用

  1. //分类.h文件
  2. #import "LGPerson.h"
  3. NS_ASSUME_NONNULL_BEGIN
  4. @interface LGPerson (cat)
  5. @property (nonatomic, copy) NSString *lg_nickname;
  6. @property (nonatomic, copy) NSString *name;
  7. @end
  8. NS_ASSUME_NONNULL_END
  9. //分类.m文件
  10. #import "LGPerson+cat.h"
  11. #import <objc/runtime.h>
  12. @implementation LGPerson (cat)
  13. - (void)setName:(NSString *)name {
  14.     objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  15. }
  16. - (NSString *) name {
  17.     return objc_getAssociatedObject(self, _cmd);
  18. }
  19. @end
  20.   
  21. //main文件
  22. #import <Foundation/Foundation.h>
  23. #import "LGPerson+cat.h"
  24. int main(int argc, const char * argv[]) {
  25.     @autoreleasepool {
  26.         
  27.         LGPerson *t = [[LGPerson alloc] init];
  28.         t.name = @"1";
  29.         NSLog(@"%@", t.name);
  30.         
  31.     }
  32.     return 0;
  33. }
复制代码
运行结果:

总结:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4