zoukankan      html  css  js  c++  java
  • category类别中添加属性

    博主文章链接:http://www.jianshu.com/p/935142af6a47

    //1.不能添加的原因

    首先, 使用@property的时候,系统会自动生成带“_”的成员变量和该变量的setter和getter方法。也就是说,属性相当于一个成员变量加getter和setter方法。

    但是,在类别添加属性,  此时person类里并没有添加带“_”的成员变量,也没有实现setter和getter方法,只是在属性列表里添加了height属性。并且此时如果在控制器里调用self.height,程序运行时会报错,显示找不到该方法

    //综上\成员变量是一个类的东西,分类本身就不是一个类,分类本来就是OC里面通过运行时动态的为一个类添加的一些方法和属性等,不是一个真正的类,它并没有自己的ISA,类最开始生成了很多基本属性,比如IvarList,MethodList,分类只会将自己的method attach到主类,并不会影响到主类的IvarList。这就是为什么分类里面不能增加成员变量的原因。

     

     

    //2.添加的方法

    #import <objc/runtime.h>

    @interface HeartView (testProperty)

     

    @property(nonatomic,copy)NSString *str ;

    @property (nonatomic, copy) NSString *height;

     

    @end

     

    static void *strKey = &strKey;

     

    @implementation HeartView (testProperty)

     

    -(void)setStr:(NSString *)str

    {

        objc_setAssociatedObject(self, & strKey, str, OBJC_ASSOCIATION_COPY);

    //objc_setAssociatedObject(self, @"height", height, OBJC_ASSOCIATION_COPY_NONATOMIC);//方式2

     

    }

     

    -(NSString *)str

    {

        return objc_getAssociatedObject(self, &strKey);

    // return objc_getAssociatedObject(self, @"height");

    }

     

    @end

     

     

    //用来标记是哪一个属性的key常见有三种写法,但代码效果是一样的,如下:

    //

    ////利用静态变量地址唯一不变的特性

    //1static void *strKey = &strKey;

    //

    //2static NSString *strKey = @"strKey";

    //

    //3static char strKey;

     

     

    //关联策略是个枚举值,解释如下:

    //

    //enum {

    //    OBJC_ASSOCIATION_ASSIGN = 0, //关联对象的属性是弱引用

    //    

    //    OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, //关联对象的属性是强引用并且关联对象不使用原子性

    //    

    //    OBJC_ASSOCIATION_COPY_NONATOMIC = 3, //关联对象的属性是copy并且关联对象不使用原子性

    //    

    //    OBJC_ASSOCIATION_RETAIN = 01401, //关联对象的属性是copy并且关联对象使用原子性

    //    

    //    OBJC_ASSOCIATION_COPY = 01403 //关联对象的属性是copy并且关联对象使用原子性

    //};

  • 相关阅读:
    面向对象之多态(向上转型与向下转型)
    【Java面试题】解释内存中的栈(stack)、堆(heap)和静态存储区的用法
    自动装箱的本质是什么呢?
    基本数据类型float和double的区别
    Java中this和super的用法总结
    面试题——太(上)
    面试题——蓝
    C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期
    C语言——内存分配
    面试题——超
  • 原文地址:https://www.cnblogs.com/daxueshan/p/6418329.html
Copyright © 2011-2022 走看看