Effective系列-02
1.property
在OC中,一个对象拥有的实例变量往往声明为属性(property)。而不推荐像Java、C++那种在public/private下声明变量。当我们需要访问一个类的属性时,可以使用点语法,编译器会将点语法转换为调用类中对应属性的setter/getter方法。因此以下两种方法等效:
Person *person1=[Person new];
//点语法
person1.name=@"Jack";
NSLog(@"%@",person1.name);
//方法调用
[person1 setName:@"Jack"];
NSLog(@"%@",[person1 name]);
其中调用的setter、getter方法是由编译器自动编写,这个过程是在编译器执行。当我们不需要其自动编写setter、getter方法时,可以在.m文件中添加如下代码
@dynamic name;
属性也会因为其括号内的修饰符而具有一些其特有的性质(如nonatomic、weak等)。
2.实例变量
OC中,声明完属性后编译器会创建一个相应的实例变量,这个实例变量为“属性名”。通常,我们在类的外部需要访问实例变量时,需要使用点语法,而当在内部访问实例变量时,更推荐使用直接访问的方法,即直接使用“属性名”。相比于在内部也使用点语法通过属性访问,使用实例变量不需要有方法调用的过程,编译器生成的代码会直接访问实例变量的那块内存。
这样的话,需要注意的一点就是由于直接访问内存而不会调用setter/getter方法,因此copy修饰的属性使用实例变量进行赋值时,不会进行copy操作。此时与strong则完全一样,先retain新值再release旧值。
3.小结
在之前自己闷头写代码的时候,确实没有考虑到这些区别。完全是哪个写的顺手、想怎么写就怎么写,在知道了这些区别后,有点感慨自己的不足。