zoukankan      html  css  js  c++  java
  • iOS分类中通过runtime添加动态属性

    这个的话并不是说  可以  在程序运行的时候   来几个 未知的东西  就添加什么  1 2 3 4 5的属性。而是可以在系统原有类的基础上  给那个类 集合实际的工程来添加你方便实用的东西。比如  一个 label  有 一个  backgroundcolor属性,我要给它添加一个 其他的 比如 文字 第一个字的color,那么就可以用这种技术了。

    一下是从网上找的一个demo

    • 首先定义一个类
    #import@interface Person : NSObject
    @property (assign, nonatomic) NSInteger age;
    -(void)run;
    @end
    
    #import "Person.h"
    @implementation Person
    -(void)run{
        NSLog(@"%s",__func__);
    }
    @end
    • 定义分类
    #import "Person.h"
    @interface Person (PersonExtention)
    @property (copy, nonatomic) NSString *name;
    -(void)saySex;
    @end
    #import "Person+PersonExtention.h"
    #import <objc/runtime.h>
    @implementation Person (PersonExtention)
    //定义常量 必须是C语言字符串
    static char *PersonNameKey = "PersonNameKey";
    -(void)setName:(NSString *)name{
        /*
        OBJC_ASSOCIATION_ASSIGN;            //assign策略
        OBJC_ASSOCIATION_COPY_NONATOMIC;    //copy策略
        OBJC_ASSOCIATION_RETAIN_NONATOMIC;  // retain策略
    
        OBJC_ASSOCIATION_RETAIN;
        OBJC_ASSOCIATION_COPY;
         */
         /*
         * id object 给哪个对象的属性赋值
           const void *key 属性对应的key
           id value  设置属性值为value
           objc_AssociationPolicy policy  使用的策略,是一个枚举值,和copy,retain,assign是一样的,手机开发一般都选择NONATOMIC
              objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);
         */
    
        objc_setAssociatedObject(self, PersonNameKey, name, OBJC_ASSOCIATION_COPY_NONATOMIC);
    }
    -(NSString *)name{
        return objc_getAssociatedObject(self, PersonNameKey);
    }
    -(void)saySex{
        NSLog(@"%s----%@",__func__,self);
    }
    
    @end

    总结:在分类中@property不会生成_变量,也不会实现getter和setter方法,我们可以手动实现如下

    -(NSString *)name{
        return @"name";
    }
    -(void)setName:(NSString *)name{
    
    }

    但是这样是没什么意义的,而且分类中不允许定义变量,所以只能用runtime类

    欢迎大家   评论来  讨论 我的第一段见解是否正确

  • 相关阅读:
    MySQL8安装及使用当中的一些注意事项
    设计模式-观察者模式
    在线教育项目-day12【完善后端整合前端】
    在线教育项目-day12【微信扫码登录】
    在线教育项目-day12【OAuth2】
    在线教育项目-day12【完善登陆页面】
    在线教育项目-day12【整合前端登陆注册页面(2)】
    在线教育项目-day12【整合前端登陆注册页面(1)】
    在线教育项目-day12【解析oken信息】
    在线教育项目-day12【注册接口】
  • 原文地址:https://www.cnblogs.com/isItOk/p/5715394.html
Copyright © 2011-2022 走看看