一.为什么要进行内存管理

•移动设备的内存极其有限,每个app所能占用的内存是有限制的
•下列行为都会增加一个app的内存占用
Ø创建一个OC对象
Ø定义一个变量
Ø调用一个函数或者方法
•当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间。比如回收一些不需要使用的对象、变量等
•如果app占用内存过大
Ø系统可能会强制关闭app,造成闪退现象,影响用户体验

二.OC中的内存管理是管理的内存中的哪一部分:

我们知道:内存分为五大区域:栈区,堆区,数据去,bss段,代码区。而最后三者是在程序启动时由操作系统进行控制的,所以不需要我们管理。栈区存储的也都是已经初始化的基本数据类型变量和函数。而我们创建的对象则分配在堆区中,是需要我们进行管理的。

三.内存管理的管理范围
任何继承了NSObject的对象(所有的OC对象,对象类型)
对其他非对象类型(基本数据类型)无效(int、char、float、double、struct、enum等)

四.内存管理的种类。

1.手动内存管理:M(manually)R (reference)C (couting)

2系统自动管理:A(automatic )R (reference)C (couting)

在最新的Xcode中,默认内存管理管理方式是ARC想切换成MRC需要对其进行配置,如下:

五。引用计数器的介绍

对象在创建时,内部会自动创建一个引用计数器retainCount,当retainCount=0时,系统会回收当前对象,retainCount是唯一判断标记。release会-1,retain会+1,retain后返回的是自己self指针。


<pre name="code" class="objc">#import <Foundation/Foundation.h>

@interface person : NSObject

@end

@implementation person

@end

int main(int argc, const char * argv[]) {
@autoreleasepool {
/* 引用计数器的常见操作
给对象发送一条retain消息, 可以使引用计数器值+1(retain方法返回对象本身)
给对象发送一条release消息, 可以使引用计数器值-1
给对象发送retainCount消息, 可以获得当前的引用计数器值(通过%ld输出查看) 需要注意的是: release并不代表销毁\回收对象, 仅仅是计数器-1 注意:我们只能通过操作对象计数器,间接控制对象的释放与否。
*/ //创建一个person 类的对象 p.
person * p = [[person alloc]init]; // 对象创建后引用计数器就会加1。 <pre name="code" class="objc" style="font-size:18px;">

[p release]; // p  被释放掉了 p = nil; //将 指针指向nil NSLog(@"%lu", [p retainCount]); //空对象调任何方法结果都是 0 // NSLog(@"Hello, World!"); } return 0;}



版权声明:本文为博主原创文章,未经博主允许不得转载。

OC-手动内存管理的更多相关文章

  1. iOS-旧项目中手动内存管理(MRC)转ARC

    在ARC之前,iOS内存管理无论对资深级还是菜鸟级开发者来说都是一件很头疼的事.我参 加过几个使用手动内存管理的项目,印象最深刻的是一个地图类应用,由于应用本身就非常耗内存,当时为了解决内存泄露问题, ...

  2. OC:内存管理、dealloc方法、copy知识点

    属性的声明:使⽤@property声明属性
 例如:@property NSString *name: 相当于@interface中声明了两个⽅法(setter.getter): 属性的实现:使⽤@s ...

  3. OC的内存管理机制

    总的来说OC有三种内存管理机制,下面将分别对这三种机制做简要的概述. 1.手动引用计数(Mannul Reference Counting-MRC) mannul:用手的,手工的. 引用计数:reta ...

  4. object-C 手动内存管理(MRC)

    object-C的内存管理和javascript的垃圾回收不一样,今天总结下手动内存管理,ARC的后边补上. 1:基本铺垫 oc采用引用计数来表示对象的状态,比如通过init创建出来的一个对象引用计数 ...

  5. OC的内存管理(一)

    在OC中当一个APP使用的内存超过20M,则系统会向该APP发送 Memory Warning消息,收到此消息后,需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等,否则程序会 ...

  6. 12.Object-C--浅谈OC的内存管理机制

    昨天学习了OC的内存管理机制,今天想总结一下,所以接下来我要在这里bibi一下:OC的内存管理. 首先我要说的是,内存管理的作用范围. 内存管理的作用范围: 任何继承了NSObject的对象,对其他基 ...

  7. 黑马程序员——OC的内存管理学习小结

    内存管理在Objective-C中的重要性就像指针在C语言中的重要程序一样. 虽然作为一门高级语言,但OC却没有内存回收机制.这就需要开发者来对动态内存进行管理.OC中内存管理的范围是:任何继承了NS ...

  8. Objective-C 【内存管理&手动内存管理 综述】

    ------------------------------------------- 内存管理 (1)Objective-C的内存管理 栈区    存放局部变量(由于基本数据类型占用的存储空间是固定 ...

  9. IOS基础 Day-1手动内存管理

    辞职回家打算自学IOS开发,就在借个地方记录一下 Day-1      手动内存管理                   主要内容:release  retain必须配对好,不然会占用内存 慢慢积累导 ...

  10. Xcode 如何设置 自动内存管理 转换为 手动内存管理

    建议使用自动内存管理 ARC. 如果不想自动内存管理,可以在build phases 下的compile sources 中找到不想自动管理的.m文件 ,给它加compiler flags 为 -fn ...

随机推荐

  1. C++类型引用浅析

    C++类型引用浅析 引言 从最早被Bjarne Stroustrup 发明,作为C语言的扩展,到广为人知C++98标准,再到最新的C++11.C++14和C++17标准,C++一直在不断地进步.演化. ...

  2. 排列的学习(java)

    1.无重复排列 2.有重复排列 3,下一个排列 package 生成排列; public class Main { static int count=0; //a中保存原来的排列,lev表示选定第几个 ...

  3. windows下virtualenv使用报错

    virtualenv为python提供了一个独立的虚拟环境,使各种python依赖库的安装相互独立.在家里ubuntu上安装一切正常,但在公司的win7上安装总是报以下错误: "D:\Pro ...

  4. DATASNAP倒底能承受多大的负载能力

    DATASNAP是针对企业数据中间件市场而推出来的产品,如果在其它领域用它可能就不会合适. DATASNAP通信使用INDY10,INDY是阻塞型SOCKET. 1.如果使用TCP/IP长连接,DAT ...

  5. PAT 1057. Stack (30)

    题目地址:http://pat.zju.edu.cn/contests/pat-a-practise/1057 用树状数组和二分搜索解决,对于这种对时间复杂度要求高的题目,用C的输入输出显然更好 #i ...

  6. Xcode7 低版本iOS系统上下有黑边的问题

    在使用Xcode7开发时,默认的启动页改成了 Launch Screen storyboard.通常情况下还是习惯使用 LaunchImage,介绍下Xcode7 下如何改为启动页是LaunchIma ...

  7. 中文乱码 jsp正常后台接收异常

    关于中文乱码:1,解决GET方式中的中文编码问题. 在Jsp中如果用中文方式传递编码,一定要保证传递过去的是U8:情况一:在便签中<s:action > 可以使用<s:param&g ...

  8. [React] Creating a Stateless Functional Component

    Most of the components that you write will be stateless, meaning that they take in props and return ...

  9. Java的递归算法

    递归算法设计的基本思想是:对于一个复杂的问题,把原问题分解为若干个相对简单类同的子问题,继续下去直到子问题简单到可以直接求解,也就是说到了递推的出口,这样原问题就有递推得解. 关键要抓住的是: (1) ...

  10. schedule() 和 scheduleAtFixedRate() 的区别--转载

    1.  schedule() ,2个参数方法:在执行任务时,如果指定的计划执行时间scheduledExecutionTime <= systemCurrentTime,则task会被立即执行. ...