美文网首页八天学会OC
第04天OC语言(04):property增强

第04天OC语言(04):property增强

作者: liyuhong | 来源:发表于2017-07-21 17:32 被阅读6次
    • 不要等到明天,明天太遥远,今天就行动。
    须读:看完该文章你能做什么?

    你能知道property内部做了什么事情
    1> 生成setter方法、getter方法
    2> 在内部生成一个私有的变量(_成员变量)
    3> 和@synthesize age有区别 ,@synthesize age;直接赋值给age

    学习前:你必须会什么?

    了解什么是封装。


    一、本章笔记
     一、
         从Xcode4.4以后 Apple 对 @property进行一个增强,以后只要利用一个 @property 就可以同时生成 setter 、 getter 方法的声明 和实现
         没有告诉 @property 要将传入的参数赋值给谁,默认 @property 会将传入的属性 赋值给 _开头的成员变量
         
         @property 有一个弊端: 他只会生成 最简单的getter\setter方法的声明和实现,并不会对传入的数据进行过滤
         如果想对传入的数据进行过滤,那么我们就必须重写 setter\getter方法
         如果不想对传入的数据进行过滤,仅仅是提供一个方法给外界操作变量,那么就可以使用
         
         如果利用 @property来生成 getter/setter方法,那么我们可以不写成员变量,系统会自动给我们生成一个 _开头的成员变量
         注意: @property 自动带我们生成的成员变量 是 一个私有的成员变量, 也就是说是.m文件中生成的,而不是在.h文件中生成的
     二、
         如果重写了setter方法,那么property就只会生成getter方法
         如果重写了getter方法,那么property就只会生成setter方法
         如果同时 重写了getter/setter方法,那么@property就不会自动 带我们生成私有的成员变量
     三、注意:
         系统 和 @synthesize 有点区别
         系统直接赋值给 _age
         而使用 @synthesize age; 系统 则会赋值给 age;
    
    二、code
    main.m
    #pragma mark 04-property增强
    #pragma mark 概念
    /*
     一、
         从Xcode4.4以后 Apple 对 @property进行一个增强,以后只要利用一个 @property 就可以同时生成 setter 、 getter 方法的声明 和实现
         没有告诉 @property 要将传入的参数赋值给谁,默认 @property 会将传入的属性 赋值给 _开头的成员变量
         
         @property 有一个弊端: 他只会生成 最简单的getter\setter方法的声明和实现,并不会对传入的数据进行过滤
         如果想对传入的数据进行过滤,那么我们就必须重写 setter\getter方法
         如果不想对传入的数据进行过滤,仅仅是提供一个方法给外界操作变量,那么就可以使用
         
         如果利用 @property来生成 getter/setter方法,那么我们可以不写成员变量,系统会自动给我们生成一个 _开头的成员变量
         注意: @property 自动带我们生成的成员变量 是 一个私有的成员变量, 也就是说是.m文件中生成的,而不是在.h文件中生成的
     二、
         如果重写了setter方法,那么property就只会生成getter方法
         如果重写了getter方法,那么property就只会生成setter方法
         如果同时 重写了getter/setter方法,那么@property就不会自动 带我们生成私有的成员变量
     三、注意:
         系统 和 @synthesize 有点区别
         系统直接赋值给 _age
         而使用 @synthesize age; 系统 则会赋值给 age;
     */
    #pragma mark - 代码
    #import <Foundation/Foundation.h>
    #pragma mark 类
    #import "Person.h"
    #pragma mark - main函数
    int main(int argc, const char * argv[])
    {
        Person *p = [Person new];
        [p setAge:25];
    //    NSLog(@"age = %i",[p age]);
    #pragma 验证系统赋值给那个age? _age?
        /*
         注意:
         系统 和 @synthesize 有点区别
         系统直接赋值给 _age
         而使用 @synthesize age; 系统 则会赋值给 age;
         */
    //    NSLog(@"age = %i, _age = %i",p->age,p->_age);
    //    p->_age
        return 0;
    }
    
    Person
    >>>.h
    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject
    /*
    {
        @public
        int _age;
        int age;
    }
     */
    
    #pragma @property增强
    /*
     从Xcode4.4以后 Apple 对 @property进行一个增强,以后只要利用一个 @property 就可以同时生成 setter 、 getter 方法的声明 和实现
     没有告诉 @property 要将传入的参数赋值给谁,默认 @property 会将传入的属性 赋值给 _开头的成员变量
     
     @property 有一个弊端: 他只会生成 最简单的getter\setter方法的声明和实现,并不会对传入的数据进行过滤
     如果想对传入的数据进行过滤,那么我们就必须重写 setter\getter方法
     如果不想对传入的数据进行过滤,仅仅是提供一个方法给外界操作变量,那么就可以使用
     
     如果利用 @property来生成 getter/setter方法,那么我们可以不写成员变量,系统会自动给我们生成一个 _开头的成员变量
     注意: @property 自动带我们生成的成员变量 是 一个私有的成员变量, 也就是说是.m文件中生成的,而不是在.h文件中生成的
     */
    /*
     - (void)setAge:(int)age;
     - (int)age;
     */
    
    
    // 这里不知道赋值给 同名的age 还是 _age?
    @property int age;
    @end
    
    >>>.m
    #import "Person.h"
    
    @implementation Person
    
    /*
     {
        int _age;
     }
     - (void)setAge:(int)age
     {
        _age = age;
     }
     - (int)age
     {
        _age = age;
     }
    
     */
    
    /*
     如果重写了setter方法,那么property就只会生成getter方法
     如果重写了getter方法,那么property就只会生成setter方法
     如果同时 重写了getter/setter方法,那么@property就不会自动 带我们生成私有的成员变量
     */
    - (void)setAge:(int)age
    {
        if (age < 0) {
            age = 0;
        }
        _age = age;
    }
    @end
    

    相关文章

      网友评论

        本文标题:第04天OC语言(04):property增强

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