本节讨论了如何使用申明属性与系统内部实际使用了自动生成的方法用作属性访问的接口,由此引入的实例变量管理等等问题。
使用申明属性 declared properties 可以方便地实现访问器方法 accessor methods.
申明属性为访问器方法行为提供一种清晰,明确的规范。
编译器帮你将申请属性扩展为访问器方法实现以短减你书写的代码量。
申明属性也是一类标识符并且有自己的作用域,因此编译器可以探测到未申明的属性。
语法: @property(attributes) type name;
例如: @interface MyClass : NSObject { float value; } @property float value; @end
setter 的几种语义: assign: 简单赋值 retain: 前一个值会收到一个 release 消息。 copy: 复制
如果你不使用 垃圾回收器,则需要指定 assign/retain/copy,否则会收到一个警告。
可以指定原子性和非原子性。
如果是 retain/copy, 则在未指定 automic 时会自动使用一个内部锁来实现原子性。
如你使用垃圾回收机制,则可以指定引用是强引用还是弱引用,不过这个是非正式的。
@synthesize firstName, lastName, age = yearsOld;
指定了实例变量名的 属性申明。
不论你是否指定实例变量名,这个变量都只对当前类有效而不对父类可见。
@dynamic
关于使用 @properties
任何 Object-C 的类都可以申明。
可以在子类中重新申明,而且 modifier
copy: 使用这个 property 在某些情形下比较有用,比如 要赋值一个 mutable 的 string 这样保证后续的修改不会影响到这个已赋值的变量。
非 asign 的 property 应该 - (void)dealloc { [property release]; [super dealloc]; } 或者(新版本,因为无法直接访问实例变量) - (void)dealloc { [self setProperty:nil]; [super dealloc]; }
子类中的 property 可以使用 writable 盖掉父类中的 readonly 属性。
不同的属性对性能的影响。
在旧环境中 @synthesize 属性的需要手动申明实例变量,而新系统中则不需要,系统会 自动帮你做。
本节涉及到不同类型的属性及由此带来的赋值方式差异,运行时性能,操作原子性,线程安全,向后性兼容性等问题,需要在使用仔细参照。
|
请发表评论