学习深复制和浅复制

1.什么是可变的对象?

不可变对象,意味着这个对象声明的变量的值不可变,而是表示它初始化以后,你不能改变该变量所分配的内存中的值,但你可以重新分配该变量所处的内存空间。可变对象(Mutable),意味着你可以追加它的内存空间,或者修改它所分配的内存空间中的值。

for example: NSArray 和 NSMutableArray.NSMutableArray可以使用 addObject方法。


2.深复制和浅复制

参见 http://blog.sina.com.cn/s/blog_991afe570101h9yp.html

一般深复制就是内容复制,浅复制是指针复制。

retain是浅复制,引用计数+1

copy:当对象为可变对象时为深复制,引用计数不变;当对象为不可变对象时为浅复制,引用计数+1。

mutableCopy:为深复制,引用计数不变。

(自定义的类要实现NSCopying, NSMutableCopying两个协议。)


3.强引用和弱引用 (strong vs weak)

参见 http://www.cnblogs.com/Piosa/archive/2012/02/17/2356239.html

强引用与弱引用的广义区别:
  强引用也就是我们通常所讲的引用,其存亡直接决定了所指对象的存亡。如果不存在指向一个对象的引用,并且此对象不再显示列表中,则此对象会被从内存中释放。
  弱引用除了不决定对象的存亡外,其他与强引用相同。即使一个对象被持有无数个若引用,只要没有强引用指向他,那麽其还是会被清除。没办法,还是 “强哥” 有面子。

strong相当于 retain,当计数为0时销毁。

weak相当于assign,计数不变,dealloced时,会置为nil。

assign是直接复制,引用计数不变。基础数据类型,及delegate设为assign类型。

(对象release后,最好设为nil)

4.为甚delegate用assign类型不用retain

(1)生命周期

// A.m中某处

B* b = [B alloc] init];

b.delegate = self;

[self.view addSubview:b];

[b release];

在A中定义了b,则A的生命周期应该长于b。


(2)循环引用

例如在UITableViewController中使用retain了UITableView,但是UITableView的delegate引用了UITableViewController


其他关键词

1.readonly表示这个属性是只读的,就是只生成getter方法,不会生成setter方法.
2.readwrite,设置可供访问级别
3.retain,是说明该属性在赋值的时候,先release之前的值,然后再赋新值给属性,引用再加1。
4.nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。


补充:

1.alloc方法被调用后,会调用allocWithZone。

2.序列化时,要实现 NSCoding协议。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值