美文网首页
从runtime角度理解属性和成员变量的区别

从runtime角度理解属性和成员变量的区别

作者: 编程_书恨少 | 来源:发表于2018-11-06 18:57 被阅读0次

    属性和成员变量的区别有很多的帖子都讲了,有兴趣大家可以去看一看。我就简略的说一下,属性就是在编译器的帮助下自动生成_属性名的成员变量和setter、getter方法,成员变量需要自己去书写,具体写法大家可以百度。这里我主要是从runtime的角度,查看在类中,它们到底有什么区别。直接上代码

    1.创建一个Person类

    @interface Person : NSObject
    {
        NSString *sex;
    }
    
    @property (copy, nonatomic) NSString *name;
    @property (assign, nonatomic) int age;
    @end
    

    2.分别获取变量列表、属性列表、方法列表,对比它们的区别
    2.1 先查看变量列表

    - (void)test_IvarList {
        
        unsigned int count;
        
        Ivar *varA = class_copyIvarList([Person class], &count);
        
        for (unsigned int i=0; i<count; i++) {
            
            Ivar v = varA[i];
            const char *name = ivar_getName(v);
            const char *cls = ivar_getTypeEncoding(v);
            
            NSLog(@"----%s----",name);
            NSLog(@"----%s----",cls);
            
        }
    }
    
    Snip20181106_8.png

    2.2查看属性列表

    - (void)test_PropertyList {
        
        unsigned int count;
        
        objc_property_t *propertyArray = class_copyPropertyList([Person class], &count);
    
        
        for (unsigned int i=0; i<count; i++) {
            
            objc_property_t property = propertyArray[i];
            const char *name = property_getName(property);
            const char *cls = property_getAttributes(property);
            
            NSLog(@"----%s----",name);
            NSLog(@"----%s----",cls);
            
        }
    }
    
    Snip20181106_9.png

    2.3 查看方法列表

    - (void)test_MethodList {
    
        unsigned int count;
    
        Method *methods = class_copyMethodList([Person class], &count);
        
        for (int i = 0; i < count; i++) {
            
            Method method = methods[i];
            SEL selector = method_getName(method);
            NSString *name = NSStringFromSelector(selector);
            
            NSLog(@"method_getName:%@",name);
        }
    
    }
    
    Snip20181106_10.png

    这样对比一下就很清楚了,属性是有setter和getter的,并且属性存储在PropertyList 中。成员变量是不会生成setter和getter的,它只存储在成员变量中。编译器会为属性生成一个_属性名的成员变量。以上

    相关文章

      网友评论

          本文标题:从runtime角度理解属性和成员变量的区别

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