Objective-C 之内存管理

一. 内存管理的方式

1. 内存溢出

应用程序所加载的文件总和超过iOS系统分配的程序固定的RAM,引起的Crash,用户端体验则为闪退至桌面.

2. 野指针异常

对象的内存已被系统回收,但是仍然要通过指针来操作这块内存.引起Crash.

3. 内存的管理方式

a. 垃圾回收机制(Java开发一直使用) :程序员只需要开辟内存空间,不需要进行是否,由系统判断何时释放内存空间.

b. MRC:人工引用计数,内存开辟和释放空间由程序代码控制.相对垃圾回收机制来说,内存的回收相对灵活.对程序员的要求也很高,程序员要属性内存管理机制.

c. ARC:自动引用计数:iOS5.0后编译器的特性,至允许程序员开辟空间,不许程序员写释放空间的代码片段,简化开发成本.注:释放空间的代码有编译器自动添加.

d. iOS支持的两种内存管理方式:MRC与ARC.

e. MRC的内存管理机制为:引用计数

f. ARC是基于MRC的.


二. 引用计数机制,影响引用计数的各种方法

1. 引用计数机制

(前言)C语言中,无法记录多个指针指向同一内存地址的个数,只能通过指针进行开辟堆空间操作以及释放堆空间的操作.实际开发过程中,有多个指针指向同一内存单元.

a. OC中采用引用计数机制管理内存,每个对象都有一个引用计数器,用来记录当前对象的引用次数.原理:当一个新的引用指向对象时,引用计数器就+1,去掉一个引用时,引用计数器就-1,当引用计数器为0时,该对象的空间就会被系统回收释放. 

b. retainCount返回的为该对象的引用值.(注意:自定义类实例化对象的引用值正常,若是系统类声明的对象,则可能返回的值不一定正常,或许系统其它框架的对象对其对象有所有权,则导致值与预期所想的不一致)



2. 影响引用计数的方法

a. 引用计数的步骤:

生成对象: +alloc   

开辟内存空间,让被开辟内存空间的引用计数从0变至1

持有对象: -retain

调用一次该方法,该对象被持有一次所有权,则引用计数+1

释放对象: -release / -autorelease

release方法执行后,该对象的应用值立刻-1,-autorelease方法执行后,则在将来的某一时刻该对象的引用值-1,即对象调用autorelease方法后,对象则被添加到离autorelease方法最近的autoreleasepool(自动释放池)中,当自动释放池销毁时,为池中的每一个对象发送release方法.

销毁对象: -dealloc

b. copy 把某一对象的内容进行拷贝,原对象引用纸不变,新对象的引用值+1.


3. iOS5.0之前使用NSAutoReleasePool类创建对象,之后采用 @autoreleasepool{}代替,出了大括号,即自动释放池被回收,其中的对象同一被发送release消息.


4. dealloc方法为NSObject类的方法,即:当引用值为0的时候,销毁该对象使用的空间,重写dealloc方法,切记要[super dealloc],上方添加所需代码.


三. 内存管理的基本原则

1. 凡是使用了alloc,copy,contain的方法都是让内存引用增加了,所以都必须使用release与autorelease方法让内存引用减少,在一段代码片段内,增加和减少的次数要相等.

2. 如果增加的次数大于减少的次数,则会导致内存泄露.

3. 如果增加的次数小于减少的次数,会导致过度释放.

4. 如果增加的次数等于减少的次数,但还能继续访问,会造成野指针问题.


四. 协议(类似Java中的接口)

1. Protocol(为一堆方法的声明),即只有.h文件,类似于一张任务清单,清单交给谁,谁就要完成该清单上的方法.

2. 接受协议的类实现协议中的方法.

3. 协议中@required修饰的方法,在类中必须实现,@optional的方法,在类中可选择性的实现.

4. 类遵守协议即在类的声明部分父类后边使用"<Protocol>"使用遵循多个协议时即:<Protocol1,Protocol2,....>

5. 协议的优点:让接受协议的类间接扩展了实例方法,因为一个类可以同时遵守n个协议,所以可以解决OC中类无法多继承的问题.


五. 内存拷贝

1. 一个对象要想进行拷贝必须服从NSCopying协议,定义copy的方法,如果类没有接受NSCopying协议发送copy消息,则会发生Crash.

2. NSCopying协议中为定义- (id)copyWithZone:(NSZone *)zone;方法,该方法分为三种类型.

a. 伪拷贝

伪拷贝相当于进行了retain的操作,使得该内存空间的引用数+1

- (id)copyWithZone:(NSZone *)zone {

return [self retain];

}

b. 浅拷贝

浅拷贝则为内存中出现了两个一模一样的对象,但是两个对象的实例变量指向的是同一空间.

c. 深拷贝

深拷贝则为内存中出现了两个一模一样的对象,两个对象的实例变量指向不同的空间.

3. mutableCopy方法返回的结果是一个一模一样的对象,在内存中的不同的单元.即clone出来的对象.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 内存管理 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与a...
    丶逐渐阅读 1,948评论 1 16
  • 一. 属性的属性 注: OC在Mac系统开发时,支持垃圾回收机制,然而在iOS开发时,仅支持引用计数.不支持垃圾回...
    CarsonChen阅读 229评论 0 0
  • iOS内存管理 概述 什么是内存管理 应用程序内存管理是在程序运行时分配内存(比如创建一个对象,会增加内存占用)与...
    蚊香酱阅读 5,693评论 8 119
  • 内存管理是程序在运行时分配内存、使用内存,并在程序完成时释放内存的过程。在Objective-C中,也被看作是在众...
    蹲瓜阅读 2,996评论 1 8
  • iOS开发中, 之前一直使用swift, 因此对于Objective-C的内存管理机制长期处于混乱的一知半解状态....
    icetime17阅读 838评论 1 8