A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wanwan_jz 中级黑马   /  2016-3-22 18:52  /  905 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

. @property

    1). 作用: 自动生成getter setter方法的声明.
             因为是自动生成etter sette方法的声明 所以,应该写在@interface中.

    2). 语法:
        @property 数据类型 名称;
        @property NSString *name;

        原理:在编译器编译的时候.会根据这个@property自动的生成getter setter方法的声明.

        生成方法的规则:
        @property 数据类型 名称;
        a. 先生成setter方法的声明
           - (void)set名称首字母大写:(数据类型)名称;

        b. 再生成getter方法的声明.

           - (数据类型)名称;


        @property int age;

        - (void)setAge:(int)age;
        - (int)age;



3. 使用@property注意.

    1). @property的类型要和属性的类型一致.

    2). @property的名称要和属性的名称一致(只是去掉下划线)

    3). 一定要按照这个规则来.只有这样它自动生成的getter  setter方法名称才符合我们的规范.

    4). @property可以批量声明.

        当@property的类型相同的时候,可以批量声明.
        类型不同是不可以批量声明的.

    5). @property只是生成getter setter的声明.
        实现还要自己苦逼的去实现啊.

   -----------------------------


3.  虽然@synthesize会自动的生成属性.
     我认为他生成的这个属性的名称是很不符合规范.

     所以,我希望@synthesize不要去自动生成私有属性.并且在getter setter的方法实现中操作的属性是已经存在的属性.


     语法格式:
     @synthesize @pro名称 = 已经存在的属性名;
     @synthesize name = _name;

     意义:
     1). 不会再去自动生成私有属性了.
     2). 自动生成setter方法的实现.
         直接将参数的值赋值给后面指定的属性.
     3). 自动生成getter方法的实现.
         直接将返回后面指定的属性的值.



4. 使用注意.

    @synthesize生成的setter、getter方法的实现.
    没有逻辑判断. 是直接赋值或者返回的.

    如果你有自己的逻辑判断.那么重写这个方法就可以了.



    @synthesize仍然可以批量声明.

    类型不同,也可以批量.

   -----------------------------

1. 我们刚才讲的@property @synthesize 这些用法是在Xcode4.4之前的用法.
    从Xcode4.4开始. 苹果对property做了1个增强


    从4.4以后.只要写1个@property. 编译器就会自动的帮助你完成如下工作

    1). 会自动的帮助你生成1个带下划线的、类型和@pro类型一致的属性.

    2). 会自动的帮助你生成这个属性的getter setter方法声明.

    3). 会自动的帮助你生成这个属性的getter setter方法实现.



2. @property的原理.


    @interface HMPerson : NSObject
    @property NSString *name;
    @end


    @implementation HMPerson

    @end

    ---------------编译器在编译的时候-----------

    @interface HMPerson: NSObject

    - (void)setName:(NSString *)name;
    - (NSString *)name;
    @end


    @implementation HMPerson
    {
        NSSteing *_name;
    }
    - (void)setName:(NSString *)name
    {
        _name = name;
    }
    - (NSString *)name
    {
        return _name;
    }
    @end

3. @property做的事情.

    1). 生成1个和@pro类型相同、名称加1个下划线的私有属性.
        这个属性是生成在@implementation中的.

    2). 自动生成这个私有属性的getter setter方法的声明.

    3). 自动生成这个私有属性的getter setter方法的实现.

        setter如何实现: 直接将参数的值赋值给生成的那个私有属性
        getter如何实现: 直接返回生成的那个私有属性的值.




4. 使用@property要注意的几个问题.

    1). @property的类型要和需要生成的属性的类型一致.
        @pro的名称要和想要生成的属性的名称一致.去掉下划线.

    2). @property也是可以批量声明的. 前提是类型相同的情况下.


    3). @property生成的方法实现是没有任何逻辑验证的.
        如果你有逻辑验证,可以自己重写.

        如果你重写了setter方法 @property仍然会自动生成私有属性 和 getter 方法.
        如果你重写了getter方法.@property仍然会自动生成私有属性 和 setter 方法.

        通过你同时重写了getter setter,那么@property就不会自动生成私有属性了.




5. 所以.

    从今往后.我们不再为类声明属性、不再写getter setter方法的声明 不再写getter setter方法的实现.

    如下几个情况除外.

    1). 属性不需要被外界访问.
    2). 有自己的逻辑验证.

1 个回复

倒序浏览
我就试试回复会有技术分吗。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马