从 c++ 到 objective-c(13):内存管理

从 c++ 到 objective-c(13):内存管理

ID:13596859

大小:38.00 KB

页数:3页

时间:2018-07-23

从 c++ 到 objective-c(13):内存管理_第1页
从 c++ 到 objective-c(13):内存管理_第2页
从 c++ 到 objective-c(13):内存管理_第3页
资源描述:

《从 c++ 到 objective-c(13):内存管理》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、从C++到Objective-C(13):内存管理作者: DevBean 日期:2011年03月29日发表评论 (3)查看评论new和deleteObjective-C中没有new和delete这两个关键字(new可以看作是一个函数,也就是alloc+init)。它们实际是被alloc和release所取代。引用计数内存管理是一个语言很重要的部分。在C和C++中,内存块有一次分配,并且要有一次释放。这块内存区可以被任意多个指针指向,但只能被其中一个指针释放。Objective-C则使用引用计数。对象知道自己被引用了多少次,这就像狗和狗链的关系。如

2、果对象是一条狗,每个人都可以拿狗链拴住它。如果有人不想再管它了,只要丢掉他手中的狗链就可以了。只要还有一条狗链,狗就必须在那里;但是只要所有的狗链都没有了,那么此时狗就自由了。换做技术上的术语,新创建的对象的引用计数器被设置为1。如果代码需要引用这个对象,就可以发送一个retain消息,让计数器加1。当代码不需要的时候则发送一个release消息,让计数器减1。对象可以接收任意多的retain和release消息,只要计数器的值是正的。当计数器成0时,析构函数dealloc将被自动调用。此时再次发送release给这个对象就是非法的了,将引发一个

3、内存错误。这种技术并不同于C++STL的auto_ptr。Boost库提供了一个类似的引用计数器,称为shared_ptr,但这并不是标准库的一部分。alloc,copy,mutableCopy,retain,release明白了内存管理机制并不能很好的使用它。这一节的目的就是给出一些使用规则。这里先不解释autorelease关键字,因为它比较难理解。基本规则是,所有使用alloc,[mutable]copy[WithZone:]或者是retain增加计数器的对象都要用[auto]release释放。事实上,有三种方法可以增加引用计数器,也就意

4、味着仅仅有有限种情况下才要使用release释放对象:·使用alloc显式实例化对象;·使用copy[WithZone:]或者mutableCopy[WithZone:]复制对象(不管这种克隆是不是伪克隆);·使用retain。记住,默认情况下,给nil发送消息(例如release)是合法的,不会引起任何后果。autorelease不一样的autorelease前面我们强调了,所有使用alloc,[mutable]copy[WithZone:]或者是retain增加计数器的对象都要用[auto]release释放。事实上,这条规则不仅仅适用于al

5、loc、retain和release。有些函数虽然不是构造函数,但也用于创建对象,例如C++的二元加运算符(obj3operator+(obj1,obj2))。在C++中,返回值可以在栈上,以便在离开作用域的时候可以自动销毁。但在Objective-C中不存在这种对象。函数使用alloc分配的对象,直到将其返回栈之前不能释放。下面的代码将解释这种情况://第一个例子-(Point2D*)add:(Point2D*)p1and:(Point2D*)p2{Point2D*result=[[Point2Dalloc]initWithX:([p1getX

6、]+[p2getX])andY:([p1getY]+[p2getY])];returnresult;} //错误!这个函数使用了alloc,所以它将对象的引用计数器加1。//根据前面的说法,它应该被销毁。//但是这将引起内存泄露:[calculatoradd:[calculatoradd:p1and:p2]and:p3];//第一个算式是匿名的,没有办法release。所以引起内存泄露。 //第二个例子-(Point2D*)add:(Point2D*)p1and:(Point2D*)p2{return[[Point2Dalloc]initWith

7、X:([p1getX]+[p2getX])andY:([p1getY]+[p2getY])];}//错误!这段代码实际上和上面的一样,//不同之处在于仅仅减少了一个中间变量。 //第三个例子-(Point2D*)add:(Point2D*)p1and:(Point2D*)p2{Point2D*result=[[Point2Dalloc]initWithX:([p1getX]+[p2getX])andY:([p1getY]+[p2getY])];[resultrelease];returnresult;}//错误!显然,这里仅仅是在对象创建出来之后

8、立即销毁了。这个问题看起来很棘手。如果没有autorelease的确如此。简单地说,给一个对象发送autorelease消息意味着告诉它

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。