Effective系列-02

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.小结

在之前自己闷头写代码的时候,确实没有考虑到这些区别。完全是哪个写的顺手、想怎么写就怎么写,在知道了这些区别后,有点感慨自己的不足。

你可能感兴趣的:(Effective系列-02)