Objective C 高级进阶—属性assign, copy, retain内存分析

最近浏览某些博客文章或者论坛,发现有些人还是对OC的一些属性理解不是很清楚,或者博客里讲解的不深入,以至于大家只是表面上理解了,深层次的还是没有理解,下次用的时候还是不知道如何去使用这些属性,这里给大家系统的讲解一下,如有理解错误的地方,请大家及时发表评论,一遍及时更正!


先来说说assign, copy, retain的基本定义层面上的理解


assign:是指把一个对象直接复制给另一个对象, retainCount不增加. 对基础数据类型(NSInteger) 和C数据类型(int, float, double, char 等)
copy: 是指把一个对象A copy给另一个对象B,此时对象B拥有的是对象A的副本, retainCount不增加。对NSString类型常用

retain:这个属性是大家比较容易混淆的,我看到有的博客把这个属性说成是释放旧的对象,然后再赋值新的值给对象,这个说法是及其不准确的,这种说法应该是一个对象的属性的setter方法才是这样的原理,举例:


Class A对象有如下属性
@property(nonatomic,retain)NSMutableDictionary *testObj;

当给Class A的这个属性赋值的时候,也就是调用A.testObj = NSMutableDictionary; 实际上是调用Class A的这个属性的内置的setter方法
内置的setter 方法 如下:
- (id) setTestObj:(id)newObj{
/** release the old object */
if(testObj)
{[testObj release];
} 
// set the new object 
testObj = [newObj retain];
}


到这里大家应该明白了,retain并没有释放旧对象,赋值新对象的功能,这是setter的功能,那么retain的特性到底是什么呢?请大家看官方的内存原理图



大家仔细看完这个图就应该立刻明白retain 和copy的特性了。retain属性只对Foundation里的类起作用,下面具体讲解一下这个图
1. 先 alloc init 了一个class A, 此时retain count 由0变成1
2. 把class B = [classA retain] 之后,注意,此时内存中有两个指针同时指向A对象,一个是classA的实例对象,一个是classB的实例对象,并且Objective-C特有的retain count 增加为2.
3. 此时 [classA release],这时候内存中只有一个指针classB的实例对象指向A对象,retain count 减1,此时为1,A对象不会从内存中消失,因为此时classB的实例对象还在指向它。这里还有需要注意的地方,虽然此时classA的实例对象已经release,但如果去NSLog这个实例对象的时候还是有内存地址的,严格意义上来讲release之后我们应该把release的对象set为nil,防止野指针的产生。
4. [classB release]同理,此时retain count为0,对象销毁。
5. ClassC = [classB copy],此时内存中有两个不同的指针分别指向两个相同的对象,这就是copy的特性,产生两个完全独立的对象,classB release之后,实例对象C依然存在内存中。


好了,只是大概的讲解了一下大家可能在理解上存在的误区,其他的属性就不一一讲解了,如果大家发现有什么不对的地方,请及时给与评论纠正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值