@property && @synthesize

@property与@synthesize配对使用(如今可以在.m中省略@synthesize声明,自动完成@synthesize功能,重写getter与setter或者在协议中声明的属性除外)
@property:

  • 在.h中声明成员变量编译器自动添加上setter,getter方法使其成员变量称为属性

@synthesize:

  • 在.m中声明,编译器自动添加上该成员变量setter,getter方法

格式:

  • 声明property的语法为:@property (参数1,参数2,参数3) 类型 名字;
  • 如:
    • @property(nonatomic, strong) UIWindow *window;
    • 参数分3类:
      • 1.读写属性: (readwrite/readonly)
        • 默认readwrite
      • 2.setter语意:(assign/retain/copy)
        • 默认assign
      • 3.原子性: (atomic/nonatomic)
        • 默认atomic
    • 参数意义:
      • readwrite:
        • 产生setter\getter方法
      • readonly:
        • 只产生简单的getter,没有setter。
      • assign:
        • 默认类型,setter方法直接赋值,而不进行retain操作
        • 一般Scalar Varible用该属性声明,比如,int, BOOL
      • retain:
        • setter方法对参数进行release旧值,再retain新值。
      • copy:
        • setter方法进行Copy操作,与retain一样
      • nonatomic:
        • 不是多线程操作使用nonatomic(多线程下可以通过在getter/setter方法加锁实现兼容多线程操作)
        • 多线程下选用atomic(多线程下也不建议使用atomic,atomic并不能保证数据准确性,以及该类型会降低性能,应通过GCD实现保证线程安全)
      • 所有者属性:
        • 所有权有关系的属性,关键字间的对应关系:
          • strong __strong 有
          • weak __weak 无
          • unsafe_unretained __unsafe_unretained 无
          • copy __strong 有
          • assign __unsafe_unretained 无
          • retain __strong 有
          • /*
          • delegate 和 Outlet 应该用 weak 属性来声明
          • block应用copy属性来声明
          • */

@synthesize和@dynamic区别:

  • 在声明property属性后,有2种实现选择:
    • @synthesize
      • 编译器期间,让编译器自动生成getter/setter方法。
      • 当有自定义的存或取方法时,自定义会屏蔽自动生成该方法
    • @dynamic
      • 告诉编译器,不自动生成getter/setter方法,避免编译期间产生警告,然后由自己实现存取方法
      • 或存取方法在运行时动态创建绑定

 

posted @ 2016-03-13 02:16  Jk_Chan  阅读(206)  评论(0编辑  收藏  举报