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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值