这段时间被导师催着论文,调试各种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对象,然后,对象将自动地放置到该对象中。在程序末尾,我们只需要释放池就可以释放所有对象。

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

浅谈objective—C管理内存的更多相关文章

  1. 浅谈javascript性能-管理内存

    上次说到,javascript脚本到底应该放在哪里?用什么用处? 以下2点: 在Html.Body部分中的JS会在页面加载的时候执行.即-用户触发一个事件的时候执行的脚本.eg:onload事件... ...

  2. 浅谈SQL Server 对于内存的管理

    简介 理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理. 二级存储(secondary storage) ...

  3. (转)浅谈SQL Server 对于内存的管理

    简介 理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理. 二级存储(secondary storage) ...

  4. 浅谈JavaScript中的内存管理

    一门语言的内存存储方式是我们学习他必须要了解的,接下来让我浅谈一下自己对他的认识. 首先说,JavaScript中的变量包含两种两种类型: 1)值类型或基本类型:undefined.null.numb ...

  5. 浅谈React数据流管理

    引言:为什么数据流管理如此重要?react的核心思想就是:UI=render(data),data就是我们说的数据流,render是react提供的纯函数,所以用户界面的展示完全取决于数据层.这篇文章 ...

  6. 浅谈Objective—C中的面向对象特性

    Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...

  7. 浅谈Linux进程管理

    一  查看系统进程 在linux中,查看系统进程的命令为ps,常用格式为如下两个: (1)ps aux:unix格式查看系统进程 (2)ps -le:linux格式查看系统进程 一般地,ps aux更 ...

  8. 【Linux】浅谈段页式内存管理

    让我们来回顾一下历史,在早期的计算机中,程序是直接运行在物理内存上的.换句话说,就是程序在运行的过程中访问的都是物理地址.如果这个系统只运行一个程序,那么只要这个程序所需的内存不要超过该机器的物理内存 ...

  9. 浅谈SQL Server 对于内存的管理--宋沄剑 英文名:CareySo

    http://www.cnblogs.com/CareySon/archive/2012/08/16/HowSQLServerManageMemory.html

随机推荐

  1. Android 进阶 Fragment 介绍和使用 (一)

    Fragment概述 Fragment是activity的界面中的一部分或一种行为.你可以把多个Fragment们组合到一个activity中来创建一个多面界面并且你可以在多个activity中重用一 ...

  2. unity3d学习重点记录

    本文主要是记录在学习unity3d中遇到的重点功能的实现,以及一些API的使用方法.以便在以后使用到的时候查找. 1,给一个UIButton添加执行的事件 // Use this for initia ...

  3. Centos7 install Openstack - (第四节)添加计算服务(Nova)

    Centos7 install Openstack - (第四节)添加计算服务(Nova) 我的blog地址:http://www.cnblogs.com/caoguo 该文根据openstack官方 ...

  4. 数据结构-多级指针单链表(C语言)

    偶尔看到大一时候写了一个多级链表,听起来好有趣,稍微整理一下. 稍微注意一下两点: 1.指针是一个地址,他自己也是有一个地址.一级指针(带一个*号)表示一级地址,他自身地址为二级地址.二级指针(带两个 ...

  5. OSGI.NET 学习笔记(一)

    1. 关于OSGI.NET 在介绍 OSGI.NET 前先介绍下OSGi, OSGI全称为Open Service Gateway Initiative,它一方面指由IBM.Oracle.BEA.SA ...

  6. android 上传文件用php程序在服务端接受(一)

    php服务端接受程序..file_up.php. <?php /* require_once('lib/session_config.php'); require_once('lib/flydc ...

  7. ant风格是什么?

    我们在看java技术书籍的过程中,当加载文件时总会遇到是否支持ant风格路径加载,这里说的ant风格是什么意思呢,今天我查了一下,明白了什么意思,现在总结一下 ANT通配符有三种: 通配符 说明 ? ...

  8. fstab

    开机后,挂载windows盘失败, 进入了一个检测shell,该shell下是以只读方式挂载根分区的,要使fstab可写,要执行mount -o remount,rw / /etc/fstab文件的解 ...

  9. C# 事务处理

    前言: 通常SqlHelper类为了方便处理,做成了静态类,静态类的问题是不方便添加事务处理. 实例化类方便添加事务处理,DoTrans/CommitTrans/RollBackTrans  三个函数 ...

  10. 在vs2005中使用AnkhSvn服务端IP改变无法连接

    1.打开VS2005,选择文件-->Subversion-->Pending Changes 2.在弹出的对话框中 选择other. 荆州古城