object-c 2.0的属性访问器和相应的编程策略

object-c 2.0新特性-属性访问器

摘自《Objective-C 2.0的新特性与运行时编程》

属性访问器:
不需要手动书写getter/setter方法,增加了property/synthesize关键字来实现此功能

@prpperty
用@prpperty关键字声明属性,这样在编译后的代码中,自动添加成员变量的getter/setter方法
使用不同的参数,生成的setter方法是不一样的,例如:
1 属性是对象类型,需要使用retian/assign/copy参数,表示setter方法内部,持有对象的方式,retian增加引用计数器,是强引用;assign是变量直接赋值,是弱引用;copy是把setter的参数复制一份,再赋给成员变量
2 属性为基本数据类型时,不需要使用retian/assign/copy参数
3 所有类型的属性都可以使用atomic/nomatomic参数,前者表示属性是原子的,支持多线程并发访问,在setter方法中增加了同步锁,后者是非原子的,适合在非多线程的环境中提升效率,因为在setter中没有同步锁的代码
4 使用readonly参数不生成setter方法

@synthesize
表示在m文件中自动实现访问器方法

“.”操作符
使用.操作符号来引用对象的属性时,调用的是setter/getter方法,这也是object-c 2.0的新特性
"对象.属性"在“=”右侧,调用getter方法
"对象.属性”作为一个参数时,调用getter方法

====================================
====================================
相应的编程策略

@property  ( nonatomic MY_RETAIN NSArray  *arr;  //1


- (void)initDatas

{

    NSMutableArray *array = [[NSMutableArray alloc]initWithCapacity:10];

    

    for (NSUInteger i=0; i<3; i++) {

        NSNumber *num = [[NSNumber alloc]initWithInteger:i];

        [array addObject:num];

        [num release];

    }

    self.arr = array;             //2

    RELEASE_SAFELY(array);

    NSLog(@"_arr: %@"_arr);     //3

}



- (void)dealloc

{

    RELEASE_SAFELY(_arr);          //4

    [super dealloc];

}


1 声明属性时,对象属性用retain参数,这样在生成的setter方法里面会自动为属性增加引用计数器

2 给属性赋值,要另外创建一个相同类型的对象,然后用self.arr=array;方式来赋值,然后释放创建的对象。
如果用下面代码直接给属性创建空间:
    self.arr = [[NSMutableArray alloc]initWithCapacity:10];
则_arr指向的内存区引用计数器为2,用alloc增加1次,用setter方法又增加1次。这样显得混乱,容易导致内存泄漏。
当然可以用下面赋值语句:
     _arr = [[NSMutableArrayalloc]initWithCapacity:10];
这样,_arr指向的内存区引用计数器为1,只用alloc增加1次,没有调用setter方法。

3 使用属性时,用"_arr"形式,这样时直接访问对象本身,也可以用"self.arr"的形势,这样时调用getter方法,速度慢

4 在dealloc方法中释放属性


总之,给属性赋值的时候,统一用"self.属性名="的方式,然后在dealloc方法中把属性所指内存区的引用计数器减1
给属性赋值时,创建的临时对象,如果是用new,alloc,copy创建的,则赋值之后就release; 如果是用便利构造器创建的,则不需要release
调用属性是,采用"_属性名"的形式,而不是用“self.属性名”来间接调用。 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值