本文转载至 http://blog.csdn.net/allison162004/article/details/38756263

Cocoa内存管理机制

(1)当你使用new、alloc、copy方法创建一个对象时,该对象的保留计数器值为1.当不再使用该对象时,你要负责向该对象发送一条release或autorelease消息。这样,该对象将在其使用寿命结束时被销毁。

(2)当你通过其他方法获得一个对象时,这假设该对象的保留计数器值为1,而且已经被设置为自动释放,你不需要执行任何操作来确保该对象被清理。如果你打算在一段时间内拥有该对象,这需要保留它并确保在操作完成时释放它。
(3)如果你保留了某个对象,你需要(最终)释放或自动释放该对象。必须保持retain方法和release方法的使用次数相等。

如果我使用了new、alloc或copy方法获得一个对象,则我必须释放或自动释放该对象。”只要你记住了这条规律,你就平安无事了。
无论什么时候拥有一个对象,有两间事情必须弄清楚:怎样获得该对象的?打算拥有该对象多长时间。

Objective-C的对象生成于堆之上,生成之后,需要一个指针来指向它。

alloc:为一个新对象分配内存,并且它的引用计数为1。调用alloc方法,你便有对新对象的所有权

copy:制造一个对象的副本(克隆体),该副本的引用计数为1,调用者具有对副本的所有权

retain:使对象的引用计数加1,并且获得对象的所有权

release:使对象的引用计数减1,并且放弃对象的所有权

autorelease:使对象的引用计数在未来的某个时候减1,并且在那个时候放弃对象的所有

 ARC简介

自动引用计数(ARC),是一项为Objective - C程序在编译时提供自动内存管理的功能。ARC可以让你把注意力集中在你感兴趣的代码,对象图,和你的应用程序中的对象之间的关系,让你不必再花费精力在retain和release操作上。正如下图所示,ARC可以减少开发中的内存管理步骤,简化开发。

ARC Support Iphone Os 4.0 or later.

“parent” object should maintain strong references to its “children,” and that the children should have weak references to their parents.

You need to be careful about sending messages to objects for which you hold only a weak reference. If you send a message to an object after it has been deallocated, your application will crash. You must have well-defined conditions for when the object is valid.

使 用ARC必须遵守的规则

不可以再显示调用dealloc、或实现调用retain、release、retainCount、autorelease这些方法。也不能使用@selector(retain)@selector(release),等等。

在ARC下去自定义dealloc方法不需要调用 [super dealloc],(实际上如果你调用了 [super dealloc],编译器会报错)。super的调用是由编译器自动强制执行的。

不能使用NSAllocateObjectNSDeallocateObject

使用alloc来创建对象,由ARC来管理对象运行时的释放。

不能在C语言的结构体中使用对象指针。

建议使用Objective-C的class来管理数据格式,来代替C语言的struct

不能隐式转换 id和void *。

你必须告诉编译器转换的类型。当你需要在obj-C的对象和Core Foundation 类型之间转换时,你可以通过函数的参数来做。详见“Managing Toll-Free Bridging”

不能使用NSAutoreleasePool对象。

不能使用memory Zone。

因为现在Objective-C运行时已经忽略NSZone了,所以没必要再使用NSZone了

Property 属性

assign: 简单赋值,不更改索引计数(Reference Counting)。

copy: 建立一个索引计数为1的对象,然后释放旧对象(开辟新的内存地址)

retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1

retain的实际语法为:

  1. - (void)setName:(NSString *)newName {
  2. if (name != newName) {
  3. [name release];
  4. name = [newName retain];
  5. // name’s retain count has been bumped up by 1
  6. }
  7. }

说了那么麻烦,其实接下来的话最重要:

如果你不懂怎么使用他们,那么就这样

·使用assign: 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char,等等)

·使用copy: 对NSString

· 使用retain: 对其他NSObject和其子类

nonatomic关键字:

atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。

iOS 5 中对属性的设置新增了strong 和weak关键字来修饰属性(iOS 5 之前不支持ARC)

strong关键字:strong 用来修饰强引用的属性;对应原来的retain。

该属性值对应 __strong 关键字,即该属性所声明的变量将成为对象的持有者。

weak关键字:weak 用来修饰弱引用的属性;对应原来的assign。

但是不同的是当对象被释放以后,对象自动赋值为nil;并且,delegate 和 Outlet 苹果推荐用weak 属性来声明。同时,如上一回介绍的 iOS 5 之前的版本是没有 __weak 关键字的,所以 weak属性是不能使用的。这种情况我们使用 unsafe_unretained。

OSMemoryNotification.h(内存警告)

  1. /*
  2. * Copyright (c) 2006 Apple Computer, Inc. All rights reserved.
  3. *
  4. * @APPLE_LICENSE_HEADER_START@
  5. *
  6. * This file contains Original Code and/or Modifications of Original Code
  7. * as defined in and that are subject to the Apple Public Source License
  8. * Version 2.0 (the 'License'). You may not use this file except in
  9. * compliance with the License. Please obtain a copy of the License at
  10. * http://www.opensource.apple.com/apsl/ and read it before using this
  11. * file.
  12. *
  13. * The Original Code and all software distributed under the License are
  14. * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  15. * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  16. * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
  17. * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
  18. * Please see the License for the specific language governing rights and
  19. * limitations under the License.
  20. *
  21. * @APPLE_LICENSE_HEADER_END@
  22. */
  23. #ifndef _OSMEMORYNOTIFICATION_H_
  24. #define _OSMEMORYNOTIFICATION_H_
  25. #include <sys/cdefs.h>
  26. /*
  27. **  OSMemoryNotification.h
  28. **
  29. **  Kernel-generated notification mechanism to alert registered tasks when physical memory
  30. **  pressure reaches certain thresholds. Notifications are triggered in both directions
  31. **  so clients can manage their memory usage more and less aggressively.
  32. **
  33. */
  34. __BEGIN_DECLS
  35. struct timeval;
  36. /*
  37. ** Opaque type for notification object
  38. */
  39. typedef struct _OSMemoryNotification * OSMemoryNotificationRef;
  40. /*
  41. ** Threshold values for notifications
  42. */
  43. typedef enum {
  44. OSMemoryNotificationLevelAny      = -1,
  45. OSMemoryNotificationLevelNormal   =  0,
  46. OSMemoryNotificationLevelWarning  =  1,
  47. OSMemoryNotificationLevelUrgent   =  2,
  48. OSMemoryNotificationLevelCritical =  3
  49. } OSMemoryNotificationLevel;
  50. /*
  51. ** Creation routines. Returns the created OSMemoryNotificationRef in the note param.
  52. ** returns: 0 on success
  53. **          ENOMEM if insufficient memory or resources exists to create the notification object
  54. **          EINVAL if the threshold is not a valid notification level
  55. */
  56. int OSMemoryNotificationCreate(OSMemoryNotificationRef *note);
  57. /*
  58. ** returns: 0 on success
  59. **          EINVAL if the notification is not an initialized notification object
  60. */
  61. int OSMemoryNotificationDestroy(OSMemoryNotificationRef note);
  62. /*
  63. ** Block waiting for notification
  64. ** returns: 0 on success, with the level that triggered the notification in the level param
  65. **          EINVAL if the notification object is invalid
  66. **          ETIMEDOUT if abstime passes before notification occurs
  67. */
  68. int OSMemoryNotificationWait(OSMemoryNotificationRef note, OSMemoryNotificationLevel *level);
  69. int OSMemoryNotificationTimedWait(OSMemoryNotificationRef note, OSMemoryNotificationLevel *level, const struct timeval *abstime);
  70. /*
  71. ** Simple polling interface to detect current memory pressure level
  72. */
  73. OSMemoryNotificationLevel OSMemoryNotificationCurrentLevel(void);
  74. /*
  75. ** External notify(3) string for manual notification setup
  76. */
  77. extern const charchar *kOSMemoryNotificationName;
  78. __END_DECLS
  79. #endif /* _OSMEMORYNOTIFICATION_H_ */
  1. <span style="text-indent: 32.15pt;">#import <libkern/OSMemoryNotification.h></span>
  1. - (void)didReceiveMemoryWarning{
  2. NSLog(@"Recieve memory warning");
  3. NSLog(@"~~~~~~~~~~~~~~level~~~~~~~~~~~~~~~ %d", (int)OSMemoryNotificationCurrentLevel());
  4. }

程序通常情况下都先调用AppDelegate中的applicationDidReceiveMemoryWarning, 然后程序会通知各ViewController,调用其didRecieveMemoryWarning方法

为单独文件指定是否使用ARC

当你迁移一个久工程到ARC模式下, -fobjc-arc 编译开关被默认的设置在所有的Objective-C 源代码上。 你可以使用-fno-objc-arc 来为特殊的class停用ARC 。在Xcode的 target的“Build Phases”标签, 打开Compile Sources group,展开源代码列表, 双击你想要修改的源代码的名字,再弹出框里输入-fno-objc-arc,然后点Done按钮。

总结

嵌入式设备中堆栈的内存大小都有严格的限制,所以内存的管理是个大问题,在编程过程中,及时释放我们不需要的内存对象,是基本原则。设计得不优雅的程序,可能会出现一系列的,你无可预料的问题,比如内存溢出,对象过早释放,导致程序直接crash。

ARC技术虽然能提供自动引用技术,省掉了让人烦人和容易遗漏的retain,release,autorelease等操作,其工作原理是将内存操作的代码(retain,release等)自动添加到需要的位置。即底层上使用和MRC手工引用技术一样的内存管理机制,所以使用ARC简化编码工作的同时,还是同样要对内存管理有深入的了解。

ARC技术和跟随Xcode4.2一起发布的,在缺省的工程模板里可以选择是否支持ARC技术。随着 iOS 5.1 的推出,Xcode也推出了4.3版本。在该版本下,ARC 有效时的属性(@property) 定义的时候,如果不明确指定所有权关键字,那么缺省的就是 strong。而在 Xcode4.2 中,即使 strong 也要显示指定。

IOS ARC内存管理,提高效率避免内存泄露的更多相关文章

  1. 七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 4.@property参数 5.@class和循环retain的使用 6.NSString的内存管理

    1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程 ...

  2. 启动期间的内存管理之bootmem_init初始化内存管理–Linux内存管理(十二)

    1. 启动过程中的内存初始化 首先我们来看看start_kernel是如何初始化系统的, start_kerne定义在init/main.c?v=4.7, line 479 其代码很复杂, 我们只截取 ...

  3. 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件

    本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用:根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制. 本 ...

  4. JVM内存管理:深入Java内存区域与OOM

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝 ...

  5. Objective-C 【多个对象内存管理(野指针&内存泄漏)】

    ------------------------------------------- 多个对象内存管理(野指针&内存泄漏) (注:这一部分知识请结合"单个对象内存管理"去 ...

  6. java虚拟机学习-JVM内存管理:深入Java内存区域与OOM(3)

    概述 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又 ...

  7. Go语言内存管理(一)内存分配

    Go语言内存管理(一)内存分配 golang作为一种"高级语言",也提供了自己的内存管理机制.这样一方面可以简化编码的流程,降低因内存使用导致出现问题的频率(C语言使用者尤其是初学 ...

  8. 常用Actoin算子 与 内存管理 、共享变量、内存机制

    一.常用Actoin算子 (reduce .collect .count .take .saveAsTextFile . countByKey .foreach ) collect:从集群中将所有的计 ...

  9. 待解决问题:c++栈对象的析构、虚拟内存与内存管理的关系、内存管理的解决方案。

    待解决问题:c++栈对象的析构.虚拟内存与内存管理的关系.内存管理的解决方案.

随机推荐

  1. android下socket编程问题:服务器关闭时,客户端发送请求的异常处理

    我用socket分别创建了一个服务器和一个客户端. 当服务器程序运行时,客户端和服务器发送接收数据是OK的. 但是,如果服务器程序关闭以后,客户端仍然发送请求的话,会抛出一个IOException.但 ...

  2. Google Protocol Buffer安装编译及使用

    近期玩了玩谷歌的Protocol Buffer.以下就简介下 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准.眼下已经正在使用的 ...

  3. WIN7 安装其他的系统boot

    1,安装win7系统不赘述. 2,在安装完win7系统后,准备安装CentOS7.0 3,准备ISO文件和所需软件 1.CentOS官网下载DVD ISO文件​ 一般选择DVD ISO ​     2 ...

  4. JAVA Eclipse如何重命名包

    选中某个包之后按F2即可   注意,重命名包不能有大写,而且必须有至少两级(xxx.xxx就是两级)   重命名包之后,你要修改manifest.xml文件  

  5. Python学习笔记(二)网络编程的简单示例

    Python中的网络编程比C语言中要简洁很多,毕竟封装了大量的细节. 所以这里不再介绍网络编程的基本知识.而且我认为,从Python学习网络编程不是一个明智的选择.   简单的TCP连接 服务器代码如 ...

  6. windows新建或者重命名文件及目录必须手动刷新才干显示出来问题解决方法

     首先推断注冊表中HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Update\UpdateMode值是否为0,该值若为1表示手工刷新, 该 ...

  7. LeetCode题目:Best Time to Buy and Sell Stock

    原题地址:https://leetcode.com/problems/best-time-to-buy-and-sell-stock/ 解决方法:动态规划,minimun存储的是当前价格中最小的. c ...

  8. SQL数据库从高版本到低版本的迁移,同时解决sql脚本文件太大无法打开的尴尬问题

    as we known,sql数据库高版本向低版本还原是不太可能但是又经常会碰到的事,今天实测了一种方法 步骤:任务—>生成脚本—> 下一步->高级,选择数据库版本和编写脚本数据类型 ...

  9. 工作总结 npoi 模板 导出公式 excel

    Apache POI(5):公式(formula) Apache POI(5):公式(formula) 2016年08月01日 17:44:49 阅读数:1145   package com.hthk ...

  10. Hive优化策略

    hive优化目标 在有限的资源下,运行效率高. 常见问题 数据倾斜.Map数设置.Reduce数设置等 hive运行 查看运行计划 explain [extended] hql 例子 explain ...