谈Objective-C中的property

本文深入探讨了Objective-C中property的使用技巧,包括retain、copy和assign的区别,优雅释放成员对象的方法,atomic与nonatomic的选择原则及property的可见性设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

谈Objective-C中的property

property大概是objc中唯一的元编程机制,用来快速地生成类的数据成员的get和set方法。本文谈谈我对property的一些使用心得。

1)retain,copy和assign:

retain的作用在于生成set方法时该数据成员(一定是objc对象)的引用计数+1,通常用于除NSString类型以外的objc对象。如

1
2
3
4
5
- (void)setMember:(Member *)member
{
    [member_ release];
    member_ = [member retain];
}

一个常见的例外是delegate的set方法通常设为assign,这是为了避免循环引用造成的引用计数无法归0,然后内存泄漏——考虑一个view的delegate为该view所在controller的情况。

NSString类的对象的set方法设为copy,字符串对象需要深拷贝。

变量的set方法都应设为assign。

2)优雅地释放成员对象。

以controller为例,通常在viewDidUnload方法和dealloc方法中需要释放成员对象,直接的方法是

1
[member_ release];

这样做的问题在于产生了野指针,在多线程的程序中也许会产生意想不到的bug——如果程序的设计比较奇特,

并且运气足够差的话。

优雅的做法是

1
self.member = nil;

展开来就是

1
2
[member_ release];
member_ = nil;

3)nonatomic和atomic

atomic即原子的意思,在多线程的程序中,atomic的数据成员在读写时会加锁,以极小的额外开销保证数据的安全。nonatomic则认为该数据成员不会同时被多线程读写。

个人的观点——在实际编程中准确判断一个数据成员是否有可能被多线程同时读写是不现实的,所以不必用nonatomic,由此造成的额外开销可以忽略不计。

滥用nonatomic也许会造成意料不到的bug——运气足够差的话。

4)私有与公有

应该尽量把property设成私有的——这样能让类的头文件看起来简洁很多。通常而言,一个controller中的几乎所有数据成员的property都可以设成私有的——否则意味着程序的设计很可能存在问题。

摘自:http://www.cnblogs.com/qswang/archive/2011/11/08/2360486.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值