这段时间被导师催着论文,调试各种BUg,也是醉了,发现很大程度上,内存出错,栈溢出,各种悲剧。那么今天就和大家一起对OC的内存管理来个探微吧。Objective-C使用一个保留计数记录了我们所创建的所有对象,并且,当该计数减少为0的时候,Objective-C自动收回分配给对象一个对象的内存。例如,设创建了两个对象:

Class *object1 = [ Class1 alloc];

Class *object2 = [ Class2 alloc];

现在,每个对象的保留的计数为1,我们可以通过询问每个对象其保留计数为多少并打印结果,从而验证这一点:

printf("*object1 retain count:%i\n",[object1 retainCount]);
printf("*object2 retain count:%i\n",[object2 retainCount]);

我们也可显示地自行增加保留计数,如下所示:

[object1 retain];
[object1 retain];
[object2 retain];

当我们把retain消息传递给一个对象时,它将自己增加其保留计数,因此,在这个例子中,object1的保留计数将会从1增加2并增到3,并且object2的保留计数将从1增加2.。要减少保留计数,我们要给对象发送一条release消息:

[object1 release];
[object2 release];

这两行代码会把object1的保留计数减少到2,并且object2的保留计数减少到1.。

当我们发送一条release消息把一个对象保留计数减少到0的时候,objective-C将自动回收该对象。在此,我将自动对象实现dealloc方法,以便查看objective-C如何回收对象。请看实例~

createobject.m

#import <Foundation/Foundation.h>
#import <stdio.h>
@interface Class1:NSObject
@end
@implementation Class1
@end int main(void)
{
    Class1 *object1 = [[Class1 alloc] init];
    Class1 *object2 = [[Class1 alloc] init];
    printf("Created object1\n");
    printf("Created object2\n");
    printf("*object1 retain count:%i\n",[object1 retainCount]);
    printf("*object2 retain count:%i\n",[object2 retainCount]);
    
<span style="white-space:pre"> </span>return 0;
}

看到的结果是:

上述代码创建对象,并显示保留数

下面我们来增加并显示保留数

<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="objc">#import <Foundation/Foundation.h>
#import <stdio.h>
@interface Class1:NSObject
@end
@implementation Class1
@end int main(void)
{
Class1 *object1 = [[Class1 alloc] init];
Class1 *object2 = [[Class1 alloc] init];
printf("Created object1\n");
printf("Created object2\n");
printf("*object1 retain count:%i\n",[object1 retainCount]);
printf("*object2 retain count:%i\n",[object2 retainCount]);
[object1 retain];
[object1 retain];
[object2 retain];
printf("After increatecount:");
printf("*object1 retain count:%i\n",[object1 retainCount]);
printf("*object2 retain count:%i\n",[object2 retainCount]); return 0;
}

运行结果:


<img src="http://img.blog.csdn.net/20150319204010986?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhaGFvODkxNQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
</pre><p>接下来,内存回收对象,当一个对象的保留数达到0时候,Objective-C从内存回收对象。我们通过如下方法来看看这如何做到:覆盖对象的dealloc方法,并且当回收对象的时候显示一条消息。</p><p>dealloc.m</p><p></p><pre name="code" class="objc">#import <Foundation/Foundation.h>
#import <stdio.h>
@interface Class1:NSObject
-(void) dealloc;
@end
@implementation Class1
-(void) dealloc;
{
printf("Dealloing the object\n");
[super dealloc];
}
@end int main(void)
{
Class1 *object1 = [[Class1 alloc] init];
Class1 *object2 = [[Class1 alloc] init];
printf("Created object1\n");
printf("Created object2\n");
printf("*object1 retain count:%lu\n",[object1 retainCount]);
printf("*object2 retain count:%lu\n",[object2 retainCount]);
[object1 retain];
[object1 retain];
[object2 retain];
printf("After increatecount:");
printf("*object1 retain count:%lu\n",[object1 retainCount]);
printf("*object2 retain count:%lu\n",[object2 retainCount]); [object1 release];
[object2 release]; printf("*object1 retain count:%lu\n",[object1 retainCount]);
printf("*object2 retain count:%lu\n",[object2 retainCount]); [object1 release];
[object1 release];
[object2 release]; return 0;
}

上述代码创建两个Class1对象,并且分别对增加和减少了object1和object2的保留计数,最后,得将它们的保留计数设置为0,此时Objective-C回收对象,同时覆盖方法dealloc的一条消息进行确认。

使用自动释放池

如果使用alloc或new来创建一个对象,我们将自己负责管理对象的内存(如果与内存有关时),但是,对于不是使用alloc或者new创建对象,我们可以让Objective-C使用一个自动释放池来管理它们。只要创建一个pool对象,然后,对象将自动地放置到该对象中。在程序末尾,我们只需要释放池就可以释放所有对象。

当然还有创建类时候,手动的回收,存储对象自行回收,等等。写程序,某种意义上来说,就是对内存划分。今儿就想说到这了,算是抛砖引玉~

最新文章

  1. [LeetCode] Split Array Largest Sum 分割数组的最大值
  2. js图片延迟加载
  3. 01 HDFS 简介
  4. MVC中使用Entity Framework 基于方法的查询学习笔记 (二)
  5. 软件设计Tips
  6. 西南大学校园GIS平台
  7. Java程序员
  8. 关于html转pdf
  9. eclipse Run On Server 异常:could not load the Tomcat Server configuration at Servers\tomcat V5.0 Sertomcat
  10. How Google TestsSoftware - Part One
  11. luogu1003铺地毯[noip2011 提高组 Day1 T1]
  12. eclipse平台
  13. 《Windows核心编程》学习笔记(9)– 在win7或者vista系统下提升一个进程的运行权限
  14. 为网站添加IE6升级提示
  15. JAVA基础-JDBC(一)
  16. Linux 用户组及用户管理
  17. java 1.7新特性
  18. ProxyChains 的坑, 需要关闭 sip
  19. Android项目实战(一): SpannableString与SpannableStringBuilder(转)
  20. 基于JavaMail的Java邮件发送:简单邮件发送

热门文章

  1. windows Android开发环境快速搭建和部署
  2. Unity AssetBundles and Resources指引 (一)
  3. 安装Oracle软件
  4. Weblogic发布小问题——weblogic.descriptor.DescriptorException: VALIDATION PROBLEMS WERE FOUND
  5. LA3902 Network
  6. BZOJ1996 合唱队 区间DP
  7. win7下无法安装QTP-少了Microsoft Visual c++2005 sp1运行时组件
  8. MFC六大核心机制之二:运行时类型识别(RTTI)
  9. 【MariaDB】MariaDB的复制
  10. Recover deleted pictures in iOS 9