@property本质以及协议中声明属性的原因

  • @property本质 声明&实现属性同名set&get方法,并且生成属性同名加下划线的成员变量
    如果添加readOnly,就只声明属性同名get方法并生成带下划线的成员变量
    如果添加readOnly后,同时重写了get方法, 就不会自动生成同名带下划线的成员变量了
可以通过@synthesize命令合成:
e.g.   @synthesize managedObjectContext = _managedObjectContext;
  • 在协议中的方法是没有实现的(遵循协议的类去实现), 协议中的属性只声明属性同名set&get方法,不生成属性同名加下划线的成员变量
    因为@property自动成员变量使用的是一种"懒加载"机制,不实现属性同名方法则系统无法检测何时何处需要使用成员变量并依此生成
    如果添加readOnly,就只声明属性同名get方法,不会生成setter方法和带下划线的同名成员变量
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate; 
相当于
 - (CLLocationCoordinate2D)coordinate;

所以为了方便,如果遇到协议中出现属性,直接将属性拷贝出来即可,如果需要外部设置,在.h中声明并且把readOnly关键字去掉

  • 之所以以这样的方式提供,是因为OC是单继承,多遵循

你可能感兴趣的:(@property本质以及协议中声明属性的原因)