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协议。