ios专题 -内存管理 研究
【原创】http://www.cnblogs.com/luoguoqiang1985
- ARC
【新的规则】
1. you cannot explicitly invoke dealloc
, or implement or invoke retain
, release
, retainCount
, or autorelease
你不能显示调用 dealloc, 或者实现和调用retain
, release
, retainCount
, or autorelease
2.You cannot use NSAllocateObject
or NSDeallocateObject
你不能使用 NSAllocateObject
或 NSDeallocateObject
3.you cannot use object pointers in C structures.
你不能使用C结构体指针。
4. You cannot use NSAutoreleasePool
objects
你不能使用NSAutoreleasePool
对象
5.you cannot use memory zones
你不能使用zones内存。
-----------------------------------------------------------------------------------------------------
【语言关键字】
@autoreleasepool
官方解释:
Autorelease pool blocks provide a mechanism whereby you can relinquish ownership of an object, but avoid the possibility of it being deallocated immediately (such as when you return an object from a method). Typically, you don’t need to create your own autorelease pool blocks, but there are some situations in which either you must or it is beneficial to do so.
自动释放池块提供了一个释放对象机制,但是避免立刻释放(正如当你从一个方法返回一个对象)。通常情况下,你不需要创建自己的自动释放池块,但也有一些情况,即要么你必须或有利于这样做。
There are, however, three occasions when you might use your own autorelease pool blocks:
If you are writing a program that is not based on a UI framework, such as a command-line tool.
If you write a loop that creates many temporary objects.
You may use an autorelease pool block inside the loop to dispose of those objects before the next iteration. Using an autorelease pool block in the loop helps to reduce the maximum memory footprint of the application.
If you spawn a secondary thread.
You must create your own autorelease pool block as soon as the thread begins executing; otherwise, your application will leak objects. (See “Autorelease Pool Blocks and Threads” for details.)
三种情况时可能会使用自己的自动释放池块:
如果你正在编写一个不基于一个UI框架,如一个命令行工具程序;
如果你编写创建许多临时对象的循环;
您可以使用一个自动释放池块内循环的下一次迭代之前,将这些对象。在循环中使用一个自动释放池块有助于减少应用程序的最大内存占用;
【属性描述关键字】先罗列一下关键字吧,
retain / strong: strong 和 retain 类似。在新版中,strong为默认描述属性。它实现的功能相当于释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 。
assgin : 简单赋值,针对值类型。如int, float....
weak : 跟assign差不多,唯一不同是对象被销毁后自动变为nil。
copy : 获得输入对象的一份副本,而不是输入对象的引用。使用copy的类,要实现NSCopying协议。
【局部变量】
__strong 它是默认的。一个对象仍然“活着”,只要有强指针指向它。
__weak 指定一个引用,但是不会保持被引用对象“活着”。弱引用被设置为nil当有对象没有强引用。
__unsafe_unretained 指定一个引用,但是不会保持被引用对象“活着”。并且当对象没有强引用,它不会设置为nil。当被引用对象销毁后,指针会是一个野指针。
__autoreleasing 它用于参数传递类型是id *,在返回的时候自动释放
----------------------------------------
注:集合类型使用强引用去跟踪它们的内容。(the collection classes use strong references to keep track of their contents)
- 非ARC
retain方法 release方法
新建对象时,使用autorelease方法
使用NSAutoreleasePool
注意集合引用对象时是强引用。
ios专题 -内存管理 研究的更多相关文章
- 理解 iOS 的内存管理
远古时代的故事 那些经历过手工管理内存(MRC)时代的人们,一定对 iOS 开发中的内存管理记忆犹新.那个时候大约是 2010 年,国内 iOS 开发刚刚兴起,tinyfool 大叔的大名已经如雷贯耳 ...
- iOS ARC内存管理
iOS的内存管理机制,只要是iOS开发者,不管多长的时间经验,都能说出来一点,但是要深入的理解.还是不简单的.随着ARC(自动管理内存)的流行.iOS开发者告别了手动管理内存的复杂工作.但是自动管理内 ...
- iOS之内存管理(ARC)
iOS的内存管理,相信大家都不陌生,之前是使用的MRC,由开发人员手动来管理内存,后来使用了ARC,来由系统管理内存.本文主要讲讲Autorelease,Core Foundation对象在内存管理方 ...
- 说说iOS与内存管理(上)
http://www.cocoachina.com/ios/20150625/12234.html 说起内存管理,看似老生常谈,而真正掌握内存管理的核心其实并不简单.ARC/MRR以及“谁分配谁就负责 ...
- iOS的内存管理和引用计数规则、Block的用法以及三种形式(stack、malloc、global)
学习内容 iOS的内存管理和引用计数规则 内存管理的思考方式 自己生成的对象自己持有 非自己生成的对象自己也能持有 自己持有的对象不需要时释放 非自己持有的对象不能释放 ARC有效时,id类型和对象类 ...
- 【iOS系列】-iOS中内存管理
iOS中创建对象的步骤: 1,分配内存空间,存储对象 2,初始化成员变量 3,返回对象的指针地址 第一:非ARC机制: 1,对象在创建完成的同时,内部会自动创建一个引用计数器,是系统用来判断是否回收对 ...
- iOS - OC 内存管理
1.OC 基本内存管理模型 1.1 自动垃圾收集 在 OC 2.0 中,有一种称为垃圾收集的内存管理形式.通过垃圾收集,系统能够自动监测对象是否拥有其他的对象,当程序执行需要空间的时候,不再被引用的对 ...
- Cocos2d-x内存管理研究<二>
http://hi.baidu.com/tzkt623/item/46a26805adf7e938a3332a04 上一篇我们讲了内核是如何将指针加入管理类进行管理.这次我将分析一下内核是如何自动 ...
- Cocos2d-X内存管理研究<一>
http://hi.baidu.com/tzkt623/item/651ca7d7a0aff6e055347f67 半夜没事干,研究内核,作为我cocos2d-x的第一篇教程.cocos ...
- 总结 IOS 7 内存管理
[iOS7的一些总结].iOS中的内存管理 我们知道,为了更加方便地处理内存管理问题,将开发人员从繁琐的内存的分配和释放工作中解放出来而专注于产品和逻辑,iOS提供了一种有效的方法, 即自动引用计数A ...
随机推荐
- test-from
title header1 hahhahjl header2 adfkljasd $$a^2$$ point 1 point 2 | table1 | table2 | | ---- | ---- | ...
- 除去重复记录distinct
在查询数据库时候,可以使用distinct关键字过滤重复记录 例如 SELECT distinct ShiftID FROM [AdventureWorks].[HumanResources].[Em ...
- Only one database connection at a time is supported
Only one database connection at a time is supported 在网上找到了2个方法: 1. VSS在使用过程中,尤其是数据迁移的过程中,可能会出现上述情况 ...
- javascript中call和apply方法
我们可以将call和apply看做是某个对象的方法,通过调用方法的形式来间接调用函数.call和apply的第一个实参是要调用函数的母对象,它是调用上下文,在函数体内通过this来获得对它的引用. 例 ...
- android 获取当前版本号/修改自定义的应用程序的版本号
1.获取当前版本号 PackageManager pm = getPackageManager(); PackageInfo pi = pm.getPackageInfo(getPackageName ...
- (贪心5.1.2)POJ 2287 Tian Ji -- The Horse Racing
/* * POJ_2287.cpp * * Created on: 2013年10月9日 * Author: Administrator */ #include <iostream> #i ...
- SimpleDateFormat 转化毫秒到日期时,指定特定的时区
http://blog.csdn.net/wangpeng047/article/details/8560690 影响TimeZone的因素: 1. 操作系统的时区设置. 2. 数据传输时时区设置. ...
- SecureCRT学习之道:SecureCRT经常使用快捷键设置与字体设置方法
1:假设不想每次登陆都输入password,能够在你打开的session里邮件session option->login action 选中automate logon 双击ogin 和assw ...
- [React] React Fundamentals: Component Lifecycle - Mounting Basics
React components have a lifecycle, and you are able to access specific phases of that lifecycle. Thi ...
- android105 jni概念
JNI(Java Native Interface,JAVA原生接口) ,通过JNIjava代码可以调用C代码,JNI在安卓中用的很多.安卓中的框架层就是用过JNI访问类库层的.Iphone是用C/C ...