黑马程序员技术交流社区

标题: 自己学习@property的部分做的总结,欢迎大家拍砖 [打印本页]

作者: timehzy    时间: 2015-7-23 12:11
标题: 自己学习@property的部分做的总结,欢迎大家拍砖
一、用法

        1.使用方法(生成和set/get)
        @property 变量类型 (去掉下划线的)实例变量名//声明set和get方法
            @synthesize  实例变量名//实现set和get方法
                例:@interface Person:NSObject
                    @property int age,weight;
             @end

             @implementation
                 @synthesize age,weight;
             @end
                        //这样相当于按照传统方式实现了set和get方法,可以直接用点操作符赋值和调用
                        Person *p = [Person new];
                        p.age = 10;
                        p.weight = 50;
                        NSLog(@"%d,%d",p.age,p.weight);
                       
        2.详解
        @property int num;实际是编译器自动将进行了set和get方法的声明,所代替的代码如下:
        (void)setNum:(int)num;
        (int)Num;
        @synthesize num;则替代了set和get方法的实现,代码如下
                (void)setNum:(int)num{
                        class->num = num;
                }
                (int)Num{
                        return num;
                }
               
        3.注意
        通常设定成员变量时会加下划线,例如:int _age;但是如上使用@property和@synthesize时,生成的成员变量并不是加“_”的num,而是num。
       
        4.使用方法(指定成员变量的get/set)
        如果已经设置了成员变量int _age;设置set/get方法如下:
                @property int age;
                @synthesize age = _age;
       
        5.详解
        上述方法实现了为已经设定的成员变量设置set和get方法,而@synthesize   = _age;实际上是产生了如下效果:
        (void)setAge:(int)age{
                _age = age;
        }
        (int)age{
                age = _age;
                return age;
        }
       
二、增强用法(@property)
        1.使用方法
        在Xcode4.4版本之后可以只在@interface中声明@property而省略@implementation中的@synthesize。并且这样产生的set\get方法操作对象变成了带下划线的成员变量(如果当前没有声明该变量,则自动生成)。例如:
                @interface MyClass:NSObject
                @property int num;
                -(void)test;
                @end
               
                @implementation MyClass
                -(void)test{
                        NSLog(@"_num = %d",_num);
                }
                @end
               
        注意:生成的变量是私有变量,既不能被子变量继承也不能被使用。
        2.重写
        在需要校验变量值时,可以手动重写set方法。在上例的基础上如下:
                @implementation MyClass
                -(void)setNum:(int)num{
                        if(num<0){
                                _num = 0;
                        }else{
                                _num = num;
                        }
                }
                @end
        注意:可以手动实现get或set方法,但是只能实现一个,不能同时重写两个方法

作者: 廖博伟    时间: 2015-7-23 17:48
谢谢分享




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2