美文网首页
09-property

09-property

作者: Giurlo | 来源:发表于2016-04-12 18:02 被阅读32次

    property


    @property基本使用


    • 背景: @porperty是一个编译器指令, 在Xocde4.4之前, 可以使用@porperty来代替getter/setter方法的声明, 也就是说我们只需要写上@porperty就不用写getter/setter方法的声明, 由编译器生成某一个属性的getter/setter方法的声明

    Person.h中代码示例

    #import <Foundation/Foundation.h>
    @interface Person : NSObject
    {
        int _age;
    }
    //- (void)setAge:(int)age;
    //- (int)age;
    @property int age;//Xocde4.4之前, 相当于上面两句
    @end
    

    @synthesize基本使用


    • 背景: @synthesize是一个编译器指令, 它可以简化getter/setter方法的实现

    • 什么是实现: 在声明后面写上大括号就代表着实现

    • 作用: 1.在@synthesize后面告诉编译器, 需要实现哪个@property生成的声明; 2. 告诉@synthesize, 需要将传入的值赋值给谁和返回谁的值给调用者

    Person.m中代码示例

    #import "Person.h"
    @implementation Person
    /*
        - (void)setAge:(int)age
        {
            _age = age;
        }
        - (int)age
        {
            return _age;
        }
    */
    @synthesize age = _age;//等价于上面的两个方法
    //注意:如果在@synthesize后面没有告诉系统将传入的值赋值给谁, 系统默认会赋值给和@synthesize后面写得名称相同的成员变量
    @end
    

    @property增强


    • 背景: Xcode4.4以后apple对@property进行了一个增强, 以后只要利用一个@property就可以同时生成setter/getter方法的声明和实现

    • @property有一个弊端: 它只会生成最简单的getter/setter方法的声明和实现, 并不会对传入的数据进行过滤

      • 如果想对传入的数据进行过滤, 那么我们就必须重写getter/setter方法
      • 如果不想对传入的数据进行过滤, 仅仅是提供一个方法给外界操作成员变量, 那么就可以使用@property
    • @property自动生成一个_开头的成员变量:

      • 如果利用@property来生成getter/setter方法, 那么我们可以不写成员变量, 系统会自动给我们生成一个_开头的成员变量
    • 注意:

      • @property自动帮我们生成的成员变量是一个私有的成员变量, 也就是说是在.m文件中生成的, 而不是在.h文件中生成的
      • 如果同时重写了getter/setter方法, 那么property就不会自动帮我们生成私有的成员变量

    @property修饰符


    • 读写权限:

      • readonly: 只会生成getter方法
      • readwrite: 既会生成getter也会生成setter, 默认什么都不写就是readwrite
    • getter、setter:

      • getter: 可以给生成的getter方法起一个名称
      • setter: 可以给生成的setter方法起一个名称
    • 多线程相关:

      • atomic :性能低(默认)
      • nonatomic :性能高(开发中使用nonatomic)
    • 内存管理相关:

      • retain: 就会自动帮我们生成getter/setter方法内存管理的代码, 用于MRC

      • assign: 不会帮我们生成set方法内存管理的代码, 仅仅只会生成普通的getter/setter方法,用于基本数据类型, 默认什么都不写就是assign

      • strong: ARC中保存一个对象用strong, 相当于MRC中的retain, 用于ARC

      • weak: 在ARC中如果 弱引用对象不要用assign, 用weak, assign是专门用于保存基本数据类型的, 如果保存对象用weak

      • 关于内存管理的修饰符,详见: property 关键字的区别详解:assign 与weak、 __block 与 __weak、strong 与copy的区别

    相关文章

      网友评论

          本文标题:09-property

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