property参数

来源:互联网 发布:上海欧特克软件 编辑:程序博客网 时间:2024/05/05 04:33
修饰属性(使用@property定义时) | property参数 | 读写控制|取名控制 | 引用方式 | 线程安全 || 修饰变量



修饰属性(使用@property定义时)

@property 是用来生成getter和setter方法的声明和实现的


他有四种类型的参数,可以增加其功能

  1. 读写控制 是否要生成set方法的参数
    1. readwrite 同时生成set和get方法的声明和实现 (系统默认的)
    2. readonly 只生成get方法的声明和实现

  2. 取名控制 getter和setter方法名称的参数
    1. setter 决定了set方法的名称 名称后面一定要有冒号
       // 返回BOOL类型的方法名一般以is开头
        @property (getter = isRich, setter= setIsRich:)BOOL rich;

    2. getter 绝对了get方法的名称 一般用于BOOL类型的

  3. 引用方式 set方法内存管理相关的参数   定义属性时
    1. retain 持有
      1. 持有,对原对象引用计数加1,强引用。ARC中使用strong。
      2. 希望获得源对象的所有权时,针对其他NSObject对象及其子类
      3. 在set方法内 release一次旧值,retain一次新值 适用于OC对象
      4. 在ARC中,retain被禁用, 分为 strong 强指针和 weak 弱指针
      5. strong 强指针 相当于retain,适用于OC对象
      6. weak 弱指针,相当于assign ,适用于OC对象 一般用于解决循环引用的问题

    2. assign 赋值
      1. 赋值,不涉及引用计数的变化,弱引用。ARC中对象不能使用assign,但原始类型(BOOL、int、float)仍然可以使用。
      2. 直接赋值,不对set方法做内存管理 适用于基础数据类型(NSInteger、CGFloat)和 C数据类型(int、float、double、char等等)。
      3. 在循环引用问题上,可以用assign 所用于OC对象

    3. copy 拷贝
      1. 拷贝,复制一个对象并创建strong关联,引用计数为1 ,原来对象计数不变。
      2. 希望获得源对象的副本而不改变源对象内容时, a和b各自有自己的内存,针对 NSString、Block等类型。 
      3. release一次旧值,copy一次新值

    4. weak:赋值(ARC),比assign多了一个功能,对象释放后把指针置为nil,避免了野指针。
    5. strong:持有(ARC),等同于retain。

  4. 线程安全 多线程管理的参数
    1. nonatomic 不加锁,性能高,一般用这个 set 方法的实现不加锁
    2. atomic 加锁,性能低 (默认)
      OC对象的默认属性,就是setter/getter生成的方法是一个原子操作。如果有多个线程同时调用setter的话,不会出现某一个线程执行setter全部语句之前,另一个线程开始执行setter的情况,相关于方法头尾加了锁一样。

      另外:atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。


      1. atomic提供多线程安全。是防止在写未完成的时候被另外一个线程读取,造成数据错误

      2. non-atomic:在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了 nonatomic ,那么访问器只是简单地返回这个值。




修饰变量(修饰不使用@property定义时,比如函数内的局部变量)

__strong:是缺省的关键词,强引用。
__weak:声明了一个可以自动置nil的弱引用(ARC中)。
__unsafe_unretained:声明一个弱引用,但是不会自动nil化(只有iOS 4 才应该使用)。
__autoreleasing:用来修饰一个函数的参数,这个参数会在函数返回的时候被自动释放(类似autorelease)。

默认的引用计数:
alloc:分配对象,分配后引用计数为1。
autorelease:对象引用计数减1,但如果为0不马上释放,等待最近一个pool时释放。




原创粉丝点击