一、Objective-C内存管理的对象

1. 值类型:比如int、float、struct等基本数据类型。

  • 值类型会被放入栈中,在内存中占有一块连续的内存空间,遵循先进后出的原则,故不会产生碎片。
  • 由系统分配管理

2. 引用类型:Objective-C的对象

  • 引用类型会被放到堆中,内存分配按照一定的分配算法,但无论算法多优,总会产生碎片。
  • 内存的分配和释放由程序员操作管理

3. 值类型和引用类型之间的相互转化

  • 装箱:把值类型转化为引用类型的过程叫做装箱,如把int包装为NSNumber。
  • 拆箱:把引用类型转为值类型的过程叫做拆箱,如把NSNumer转为int。

二、Objective-C内存管理的对象的方法

1. 引用计数

  • 表示对象被引用的次数,通过它可以判断对象是否被回收。
  • 如果引用计数为0,对象回收,不为0则不回收。
  • 当对象执行alloc、new、copy或者retain时,引用计数加1,release时,引用计数减1。

三、Objective-C管理内存的方式

1. 手动内存管理机制:MRC

  • MRC模式下,所有的对象都需要手动的添加retain、release代码来管理内存。
  • 使用MRC,需要遵守谁创建,谁回收的原则。也就是谁alloc,谁release;谁retain,谁release。
  • 当引用计数为0的时候,必须回收,引用计数不为0,不能回收,如果引用计数为0,但是没有回收,会造成内存泄露。如果引用计数为0,继续释放,会造成野指针。为了避免出现野指针,我们在释放的时候,会先让指针置为nil。

2. 自动内存管理机制:ARC

1)ARC模式下的property变量修饰词

  • 强引用strong:相当于retain,使用之后,计数器值+1。
  • 弱引用weak:相当于assign,使用不会改变计数器的值,指针指向的地址被释放后,会自动置为nil。
  • retain:引用计数值+1,即对象持有者的个数+1。
  • assign:设置变量时使用,不设计引用计数。
  • copy:拷贝对象。
  • readwrite与readonly:限制访问者的权限。
  • atomic与nonatomic:原子操作与非原子操作。原子操作适用于多线程,对共享资源的安全访问。非原子操作多用于非多线程,可以提高性能。

2)自动释放池

自动内存释放使用@autoreleasepool关键字声明一个代码块,如果一个对象在初始化时调用了autorelase方法,那么当代码块执行完之后,在块中调用过autorelease方法的对象都会自动调用一次release方法。这样一来就起到了自动释放的作用,同时对象的销毁过程也得到了延迟(统一调用release方法)。

  1. autorelease方法不会改变对象的引用计数器,只是将这个对象放到自动释放池中;
  2. 自动释放池实质是当自动释放池销毁后调用对象的release方法,不一定就能销毁对象(例如如果一个对象的引用计数器>1则此时就无法销毁);
  3. 由于自动释放池最后统一销毁对象,因此如果一个操作比较占用内存(对象比较多或者对象占用资源比较多),最好不要放到自动释放池或者考虑放到多个自动释放池;
  4. ObjC中类库中的静态方法一般都不需要手动释放,内部已经调用了autorelease方法;

Objective-C的内存管理的更多相关文章

  1. Objective C内存管理之理解autorelease------面试题

    Objective C内存管理之理解autorelease   Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的A ...

  2. Objective -C Memory Management 内存管理 第一部分

    Objective -C Memory Management  内存管理  第一部分 Memory management is part of a more general problem in pr ...

  3. Objective C 内存管理[转]

    1  配对原则 alloc – release new – release retain - release copy – release 2  new和alloc-init的区别 (1)区别只在于a ...

  4. Objective-C(内存管理)

    引用计数器 每个OC对象都有一个占4个字节存储空间的引用计数器 当使用或创建一个对象时,新对象的引用计数器默认是1 retain:可以使引用计数器+1 release:可以是引用计数器-1 retai ...

  5. objective C 内存管理及属性方法具体解释

    oc为每一个对象提供一个内部计数器.这个计数器跟踪对象的引用计数,当对象被创建或拷贝时.引用计数为1.每次保持对象时,调用retain接口.引用计数加1.假设不需要这个对象时调用release,引用计 ...

  6. IOS学习笔记3—Objective C—简单的内存管理

    今天简述一下简单的内存管理,在IOS5.0以后Apple增加了ARC机制(Automatic Reference Counting),给开发人员带来了不少的方便,但是为了能更好的理解IOS内存管理机制 ...

  7. objective-c(内存管理)

    本文主要记录objective-c 内存管理的知识点: 1.objective-c的对象都是分配内存在堆上,与C的mallock和C++的new类似,只有int等系统变量分配内存在栈上: 2.obje ...

  8. iOS学习17之OC内存管理

    1.内存管理的方式 1> iOS应用程序出现Crash(闪退),90%的原因是因为内存问题. 2> 内存问题 野指针异常:访问没有所有权的内存,如果想要安全的访问,必须确保空间还在 内存泄 ...

  9. iOS - OC 内存管理

    1.OC 基本内存管理模型 1.1 自动垃圾收集 在 OC 2.0 中,有一种称为垃圾收集的内存管理形式.通过垃圾收集,系统能够自动监测对象是否拥有其他的对象,当程序执行需要空间的时候,不再被引用的对 ...

  10. Objective-C----MRC内存管理 、 自动释放池 、 面向对象三大特性及封装 、 继承 、 组合与聚合

    1 MRC练习 1.1 问题 引用计数是Objective-C语言采用的一种内存管理技术,当一个对象被创建在堆上后,该对象的引用计数就自动设置为1,如果在其它对象中的对象成员需要持有这个对象时,则该对 ...

随机推荐

  1. HttpWebRequest 注意

    使用HttpWebRequest 一定要保证GetRequestStream和GetResponse对象关闭,否则容易造成连接处于CLOSE_WAIT状态 using (Stream stream = ...

  2. 【转】如何使用PhoneGap打包Web App

    如何使用PhoneGap打包Web App 最近做了一款小游戏,定位是移动端访问,思来想去最后选择了jQuery mobile最为框架,制作差不多以后,是否可以打包成App,恰好以前对PhoneGap ...

  3. gcc杂谈

    1. -l选项自动给库文件名增加lib前缀和.a/.so后缀.所以如果你有一个lib叫做libusb.a,那么编译选项是-lusb.另一方面,如果你有一个文件叫做libusb.o(是目标文件而不是库文 ...

  4. KindEditor得不到textarea值的解决方法----摘至天涯

    以前有朋友遇到过这个问题,就是KindEditor在火狐下或者其他浏览器下都无法得到textarea文本框的值,点击表单提交按钮得到的是空白.昨天天涯PHP博客[http://blog.phpha.c ...

  5. TextBox(只允许输入字母或者数字)

    实现如下: using System;using System.Collections.Generic;using System.Linq;using System.Text;using System ...

  6. C# json提取多层嵌套到数组

    string jsonText = "{'name':'test','phone':'18888888888','image':[{'name':'img1','data':'data1'} ...

  7. net farmework 4安装不了 原因是 HRESULT 0xc8000222

    1. Click Start, Run, type: cmd and press Enter. Please run the following command in the opened windo ...

  8. IREP_SOA Integration程序注释语法Annotations(概念)

    20150506 Created By BaoXinjian

  9. PO_PO系列 - 请购单系统分析(案例)

    2014-07-01 Created By BaoXinjian

  10. 安装Android SDK和ADT步骤和遇到的问题

    http://894503895.diandian.com/post/2012-05-16/18695648 1.安装eclipse.下载地址:http://www.eclipse.org/downl ...