美文网首页ios实用开发技巧
objc_getAssociatedObject和objc_se

objc_getAssociatedObject和objc_se

作者: CoderLJW | 来源:发表于2017-12-14 09:54 被阅读8次

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

    例如给 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);
          }
      }
    
    • backMsg方法中返回的是self自身,就是NSString的属性内容,此处也可以替换成在什么时候需要返回的数据。

    • 还有更多使用的方法,还请大家贴出来

    相关文章

      网友评论

        本文标题:objc_getAssociatedObject和objc_se

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