iOS常量、变量、属性及其特性(2)

8.类的声明提供了这个类和程序员之间的接口,类的声明即接口,其实现代码才是真正执行实际任务的地方。类的声明以@interface指令开始,以@end指令结束。

9.蓝色的竖线:它是UI控件和屏幕边框的距离参考线以及对齐参考线,用于设置控件在不同大小的屏幕上的位置。

13.属性使用点语法,其他情况使用方括号标记语法。

***********************************

copy:

1.简单复制只能实现浅拷贝:指针赋值,使每个指针指向相同的一块内存空间,操作不安全。

2.在iOS中可以这样实现:Foundation类已经遵守了<NSCopying>和<NSMutableCopying>协议,即实现了copy和mutableCopy方法,因此Foundation对象可以使用这些方法创建对象的副本或可变副本。

**************************

为属性声明自定义特性

1.访问器方法

a。我们通过@synthesize这个标记来为属性生成访问器方法。

b。默认情况下,如果我们声明的属性名为propertyName,那么编译器自动生成的访问器方法分别为propertyName:和setPropertyName:。

c。可以通过“getter=getterName”和“setter=setterName”这两个属性的自定义特性来设置访问器方法的名称。

d。自定义访问器方法的名称会导致“点句式”语法糖不好使。

2.可写性

如果给属性加上readonly的特性:编译器不会自动生成setter访问器方法,属性也就变成只读的。

3.setter支持的特性

a。setter方法不仅仅是简单的赋值,有这么几个修饰词是用来描述setter方法的:assign,retain,copy和weak,用不同的修饰词表示生成的setter方法会有所不同。

b。默认是assign,这意味着在setter方法中真的就是简单的赋值。

c。retain:表示赋值之后会调用新值的retain方法和旧值的release方法。

d。copy:表示先将值拷贝一份,然后将这个拷贝赋给实例变量,这个修饰词只适用于实现了NSCopying协议的类型。

e。weak:表示这个值将是一个弱引用,引用和被引用之间没有所属关系。如果系统销毁了某个属性所引用的对象,属性的值会自动地变为nil。一般情况下,如果父对象拥有子对象的引用,那么子对象就不应该再持有父对象的强引用,而是使用弱引用的方式来引用父对象。

f。strong:表示这个值是一个强引用,引用和被引用之间具有所属关系。从内存使用的角度来看,就是引用对象被回收之前,被引用的对象不会被回收。

4.原子化和非原子化:atomi和nonatomic用来决定编译器生成的getter和setter是否为原子操作。

a。nonatomic指定访问器方式是非线程安全的,即多个线程可以同时访问这个属性。

b。默认情况下,访问器方法都是 线程安全的,即使在多线程环境中也毫无风险的。然而,即使要保证在多线程环境中能正常工作,访问器也不一定必须是线程安全的。而将访问器方法指定为非线程安全的,可以让getter方法直接返回实例变量的值,效率更高。

********************

合成(Synthesizing)属性

1.声明一个属性之后编译器会自动将相关的代码补充完整,即编译器会自动声明一个实例变量以及相关的访问器方法,实例变量的名称是属性名称前面加上下划线。

2.不过有时候我们需要自己来指定实例变量的名称,这时候就需要用到@synthesize指令了。

3.

a。如果你不得不手动指定属性对应的实例变量的名称,请在@implementation指令之后使用@synthesize指令做如下声明:

@synthesize label;

这行代码要求编译器根据接口中声明的属性来自动生成访问器方法。

b。也可以使用如下的方式来指明访问器方法使用的实例变量的名称:

@synthesize label = _label;

这里指明了实例变量名为_label,而且这是一种很好的封装实例变量的方法,让所有对该实例变量的访问都通过访问器方法来执行。同时,这种方法也可以避免编译器自动取名字时和已用的实例变量名称冲突的情况。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/ea5a7ba2918473cd3228d5a8daab4150.html