zoukankan      html  css  js  c++  java
  • runtime-给系统已有类添加属性

    在没有接触runtime之前,我们接触到的能给类进行扩展的方法有类目(category)和延展(extension)两种。类目(category)可以给系统已有类添加扩展方法但是不能添加属性,并且被添加的方法可以被此类的子类所继承;延展(extension)为我们的自定义类添加属性和方法,但是添加的属性和方法都是私有的,在此类的子类中是无法访问的。那么问题来了,如果我们想给系统已有类添加一些方便我们使用的属性要怎么办呢?上述这两种方法中能给系统已有类添加的东西的就只有类目(category)了。

    如何利用runtime给系统已有类添加属性?下面用NSDictionary来举例

    首先我们给NSDictionary创建一个类目,并在.h文件中添加一个属性

    #import <Foundation/Foundation.h>
    
    @interface NSDictionary (MyDic)
    
    @property (nonatomic, copy) NSString *name;
    
    @end

    一般情况下我们在类目(category)中添加属性在外面使用的时候就是报错

    为了不报错需要我们在.m文件中实现name属性的setter、getter方法

    - (void)setName:(NSString *)name {
        /**
         *  为某个类关联某个对象
         *
         *  @param object#> 要关联的对象 description#>
         *  @param key#>    要关联的属性key description#>
         *  @param value#>  你要关联的属性 description#>
         *  @param policy#> 添加的成员变量的修饰符 description#>
         */
        objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_COPY_NONATOMIC);
    }
    
    - (NSString *)name {
        /**
         *  获取到某个类的某个关联对象
         *
         *  @param object#> 关联的对象 description#>
         *  @param key#>    属性的key值 description#>
         */
        return objc_getAssociatedObject(self, @selector(name));
    }

    实现了name属性的setter和getter方法之后我们就把新添加的name属性和NSDictionary类关联起来了,现在在外面使用name属性就不会报错了!

  • 相关阅读:
    gdb简易教程
    使用WoeUSB在Linux上制作Win10启动盘
    How to fix git: new blank line at EOF
    使用CSS3动画属性实现各种旋转跳跃
    jQuery事件
    挖矿程序minerd入侵分析和解决办法
    css3的伪(伪类和伪元素)大合集
    HTML 5 <blockquote><p>的分工与合作
    HTML<figure> <figcaption> 标签定义图文并茂
    监听 返回按钮事件
  • 原文地址:https://www.cnblogs.com/dabaomo/p/5466995.html
Copyright © 2011-2022 走看看