OC Autorelease

一、基本用法

1.会将对象放到一个自动释放池中

2.当自动释放池被销毁时,会对池子里的所有对象做一次release

3.会返回对象本身

4.调用完autorelease方法后,对象的计数器不受影响(销毁时影响)

二、好处

1.不需要关系想你对象释放的时间,

2.不需要再关心什么时候调用release

三、使用注意

1.占用内存比较大得对象,不要随便使用autorelease,应该使用release来精确控制

2.占用内存较小的对象使用autorelease,没有太大的影响

/////////////////

/////////////////

(一)ARC的判断准则:

只要没有强指针指向对象,对象就会被释放。

(二)指针分类:

  (1)强指针:默认的情况下,所有的指针都是强指针,关键字strong

  (2)弱指针:__weak 关键字修饰的指针

(三)ARC的特点总结:

1.不允许调用release,retain,retainCount

2.不允许重写dealloc,不允许调用 [super dealloc];

[email protected]的参数:

  strong :相当于原来的retain (适用于 OC对象类型),成员变量是强指针

  weak : 相当于原来啊的assign ,(适用于 OC对象类型), 成员变量是弱指针

  assign : 适用于非OC对象类型 即基础类型 int float 等

ARC是iOS5推出的新功能,全称叫ARC(Automatic Reference Counting)。简单地说,

就是代码中自动加入了retain/release,原先需要手动添加的用来处理呢村管理的引用计数的代码

可以自动地由编译器完成了。

有一点,ARC并不是GC,它只是一种代码静态(Static Analyzer)工具。

//////////////////////////

/////////////////////////

ARC 的本质

ARC 是编译器(时)特性,而不是运行时特性,更不是垃圾回收器(GC)。

1.栈区(stack)-由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。是个线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈相互独立,因此,栈是thread safe的。每个C++对象的数据成员也存在在栈中,每个函数都有自己的栈,栈被用来在函数之间传递参数。操作系统在切换线程的时候会自动切换栈,就是切换SS/ESP寄存器。占空间不需要在高级语言里面显式分配和释放。

2.堆区(heap)-一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。是大家共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程初始化的时候分配,运行过程中也可以想系统要额外的堆空间,但是记得用完了要还给系统,要不然就是内存泄漏。堆里面一般放得时静态数据,如 Static 的数据和字符串常量什么的,资源加载后一般也放在堆里面。一个进程的所有线程共有这些堆,所以对堆得操作要考虑同步和互斥的问题。程序里面编译后的数据段都是堆得一部分。

3.全局区(静态区、Static)-全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在相邻的另一块区域。-程序结束后有系统释放

4.文字常量区-常量字符串就是放在这里的。程序结束后由系统释放

5.程序代码区- 存放函数体的二进制代码

时间: 2024-12-30 10:38:27

OC Autorelease的相关文章

黑马程序员---OC基础6【内存管理】【手动内存管理】【单、多个对象的内存管理】【*@property参数】【@class的使用】【NSString类的内存管理】【autorelease使用】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [内存管理] 1.内存管理概念 由于移动设备内存及其有限,所以每个app所占的内存也是有限的 需要回收一些不使用的空间 2.OC内存管理的范围 管理任何继承NSOject的对象,对其他的基本数据类型无效 主要管理堆区中的对象的内存管理   3.内存管理的原理 1)对象所有权概念 任何对象都可以能拥有一个或多个所有者,只要一个对象至少还拥有一个所有者,他就会继续存在 cocoasu所有权策略 任何自

24-黑马程序员------OC 语言学习笔记--- autorelease和ARC

  黑马程序员------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- autoreleaseOC提供了autorelease语法,系统可以將很多对象放到一个自动释放池中,在某个时刻统一release一次.这样就不用再次调用release方法.1.autorelease的基本用法:   1>

八.OC基础加强--1.autorelease的用法 2.ARC下内存管理 3.分类(category)4.block的学习

1.autorelease的用法   1.自动释放池及autorelease介绍 (1)在iOS程序运行过程中,会创建无数个池子,这些池子都是以栈结构(先进后出)存在的. (2)当一个对象调用autorelease时,会将这个对象放到位于栈顶的释放池中 . 2.为什么会有autorelease? OC的内存管理机制中比较重要的一条规律是:谁申请,谁释放. 但有些情况下,开发者并不能确定某些对象何时释放.这时候就需要自动释放池. 它的好处是: (1)不需要再关心对象释放的时间 : (2)不需要再关

黑马程序员-OC学习笔记之autorelease与自动释放池

---------------------- IOS开发.Android培训.期待与您交流! ---------------------- 一.autorelease autorelease与release相似,是OC中的一个对象方法.这两个方法都能把对象的引用计数器减1,但是release是一个精确的减1,对对象的操作只能在release之前进行,如果是在之后,就会出现野指针错误:而autorelease是一个不精确的引用计数器减1,当给对象发送autorelease消息时,对象就会被放到自动

OC基础(十三)autorelease自动释放池

autorelease 自动释放池 autorelease是一种支持引用计数的内存管理方式,只要给对象发送一条autorelease消息,会将对象放到一个自动释放池中,当自动释放池被销毁时,会对池子里面的所有对象做一次release操作 优点:不用再关心对象释放的时间,不用再关心什么时候调用release 原理:autorelease实际上只是把对release的调用延迟了,对于每一个autorelease,系统只是把该 Object放入了当前的autorelease pool中,当该pool被

OC 内存管理-02 autorelease 概念 以及用法

(1) @autoreleasepool { }//自动释放池代表,池子将要被销毁,对池子中所有的对象进行一次release操作 (2) 不管你这个对象时在@autoreleasepool 之内创建的还是在之外创建的,只要你在池子中调用了autorelease那么这个对象就会被放入到池子中 (3) 只有在自动释放池的作用域中调用对象的autorelease方法才能够正确的讲对象放入到池子中 (4) 如果在自动释放池中一个对象被多次释放[autorelease],那么会报野指针错误 -------

OC内存管理

OC内存管理 一.基本原理 (一)为什么要进行内存管理. 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等. 管理范围:任何继承NSObject的对象,对其他的基本数据类型无效. 本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也

iOS开发——面试篇&amp;OC基本语法总结(面试)

OC基本语法总结(面试) C和OC对比 OC中主要开发在什么平台上的应用程序? 答:可以使用OC开发Mac OS X平台和iOS平台的应用程序 OC中新增关键字大部分是以什么开头? 答:OC中新增关键字大部分是以@开头 OC中新增加了那些数据类型? 答: Block类型 指针类型(Class, id类型) 空类型 特殊类型(SEL, nil) 面向对象特性是什么? 答:继承性,封装性,多态性 import和#include有什么区别? 答:import 的功能和 include一样, 是将右边的

OC之代理协议的新概念

网摘) OBJC 中的 protocol 相当于 java 里的接口,delagate 就是接口的实现类(C中的回调类似 ): 数据源就是对象遵循了存储数据的协议,可以存储使用数据 协议表示了方法可以被任何类所实现.协议本身不是类.他们只是简单定义了一个其他对象可以实现的接口.当你的类实现了协议中的某个方法的时候也就是说你的类实现了那个协议. Objective-C的另一个扩展称为协议,它非常象Java中的接口.两者都是通过一个简单的方法声明列表发布一个接口,任何类都可以选择实现.协议中的方法通