ios实用开发技巧

objc_getAssociatedObject和objc_se

2017-12-14  本文已影响8人  CoderLJW

一般用于给分类添加【属性和方法】使用

例如给 NSString的分类NSString(JJExtend)添加【title】属性
.h文件

  #import <Foundation/Foundation.h>
  @interface NSString(JJExtend)
  /** 给NSString类动态添加 一个title属性 可以使用 set和get法  也可以使用 点语法 */
  \- (void)setTitle:(NSString *)title;
  /** 和 set 方法成对使用 */
  \- (NSString *)title;
  @end

.m文件

  #import "NSString+JJExtend.h"
  #import <objc/runtime.h> // 需要引入头文件
  @implementation NSString(JJExtend)
  - (void)setTitle:(NSString *)title
  {
      // OBJC_ASSOCIATION_COPY == copy  代表关联策略 和       @property的设置相同
// @selector(title) 也可以设置 静态的 唯一key static const char xxxxKey;  使用时 &xxxxKey
objc_setAssociatedObject(self, @selector(title), title, OBJC_ASSOCIATION_COPY);
  }
  - (NSString *)title
  {
      // _cmd 代表当前方法名 title
      return objc_getAssociatedObject(self, _cmd);
  }
  @end

调用时

    // set 方法调用和点语法通用
    [test setTitle:@"aaaaaaa"];
     //test.title = @"loujian";
    // get 获取
    NSLog(@"%@", test.title);
    // NSLog(@"%@", [test title]);

给分类添加 Block回调方法使用

.h文件

   #import <Foundation/Foundation.h>
   typedef void(^BackMsg)(NSString *msg);
   @interface NSString(JJExtend)
  /** 添加 一个block属性 */
  - (void)stringBackBlock:(BackMsg)backMsg;
  - (void)backMsg;
  @end

.m文件

  - (void)stringBackBlock:(BackMsg)backMsg
  {
      if (backMsg) {
          objc_setAssociatedObject(self, @selector(backMsg), backMsg, OBJC_ASSOCIATION_COPY);
      }
  }
  - (void)backMsg
  {
      // _cmd 代表当前方法名 backMsg
      BackMsg bm = objc_getAssociatedObject(self, _cmd);
      if (bm) {
          bm(self);
      }
  }

上一篇下一篇

猜你喜欢

热点阅读