Objective-C(十六、内存管理,自动释放池,ARC,强指针,弱指针,方法族)——iOS开发基础

原创 2015年07月09日 17:20:03

结合之前的学习笔记以及参考《Objective-C编程全解(第三版)》,对Objective-C知识点进行梳理总结。知识点一直在变,只是作为参考,以苹果官方文档为准~


十六、内存管理相关知识(二)


1、autorelease,自动释放机制
- (instancetype)autorelease;
(1)自动释放池的创建
iOS5.0之前

 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 //进行一系列操作
 //此处不可以使用breakreturngoto之类的语句
 Person *p = [[[Person alloc] init] autorelease];
 [pool release];

iOS5.0之后

@autoreleasepool {
 //进行一系列操作
 //此处可以使用break、return、goto等语句
 //代码
 };

ARC中是禁用NSAutoreleasePool的,而是用新语法来进行操作,性能更好,效率更高。

(2)基本用法
a、会将调用autorelease方法的对象放入自动释放池中;
b、当pool销毁时,池中记录的所有对象都会被发送release消息
c、调用autorelease方法不影响引用计数器的计数值,返回对象本身;

(3)优缺点
优点:不必担心实例对象何时释放,不必担心何时调用release
缺点:不能精确控制对象释放时间;若为大型对象,应该使用完立即释放,否则会占用内存。

(4)存储方式
a、以栈的数据结构进行存储,释放时遵循先进后出
b、iOS程序运行过程中,允许创建多个pool,可以嵌套使用

 @autoreleasepool {
     @autoreleasepool {
         //XXXX
     }
 }

c、当一个实例对象调用aurelease方法时,会将此实例对象放入栈顶的自动释放池。

(5)在实际开发中,往往创建类方法快速创建对象

 + (id)person {
     return [[[self alloc] init] autorelease];
 }

注意:不指定类型,使用self,这样既可以实现父类对象创建,又可以实现子类对象创建
通常系统自带的方法中若不带alloc,new,copy关键字,说明返回的实例对象是经过了autorelease的,不需要再手动调用release


2、ARC:Automatic Reference Counting,自动引用计数
(1)基本特征
a、一种编译器特性,Xcode5.0以后创建的项目自动执行ARC机制;
b、编译器会根据赋值操作、变量的初始变化、变量的生命周期等因素,在释放的位置自动加入retain/release/autorelease相关的代码;
c、ARC只能管理OC对象,不能管理通过malloc申请的内存

(2)ARC判断对象是否应该释放的准则:
只要没有强指针指向此对象,就会被释放;

(3)注意要点:
a、ARC有效地程序中,不能调用与引用计数有关的方法retain,release,autorelease,retainCount
同时也不能那个使用这类函数的selector(@selector(retain));
b、可重写dealloc,但不能调用[super delloc]
c、@property相关参数修改
strong:成员变量为强指针类型,相当于MRC中的retain(使用于OC对象)
weak:弱指针类型,相当于MRC中的assign(使用于OC对象)
assign:非指针类型(适用于非OC对象)
unsafe_unretained:非nil化的弱指针
(4)循环引用:一端用strong,一端用weak


3、强指针,弱指针(强引用,弱引用)
(1)强指针:__strong,拥有所有权的指针

(2)弱指针:__weak,不会对对象的释放产生影响
a、为了避免循环引用,需要这类变量能够引用对象,但不会成为对象所有者,不影响对象本身的而回收
b、弱指针是通过存储一个指向对象的指针创建的,且不保留对象
c、弱引用情况下,无论对变量赋值或解除引用,变量的引用计数都不会发生变化;

(3)__unsafe_unretained:非nil化的弱指针,即当所指向的内存区域被释放了,这个指针就是一个野指针了;
a、跟字面意思一样,这种类型的变量时不安全的,野指针操作不当会造成严重后果;
b、有一些类的实例不能使用自动nil化的弱引用,需要使用__unsafe_unretained代替__weak
例如lion ReleaseNote中NSWindows、NSTextView、NSFont、NSImage等类的实例不能使用弱引用,不过未来是否支持,或者当前可自动nil化的未来是否继续支持不得而知。
使用时将上述修饰词加在对象前
例如: __unsafe_unretained Person* p;


4、弱指针的自动nil化
弱指针会在其指向的实例对象被释放后自动变成nil;
即当弱指针指向的实例对象被释放了,弱指针也不会变成野指针


5、方法族:同对象生成相关的方法集合
需要满足以下命名规则(必须遵守,否则ARC可能不会释放对象,造成内存泄露)
——选择器同方法族名相同(开头的_可忽略),或选择器的名字由方法族名加上非小写字母开头的字符串构成
例如

 init
 initWithName:
 initToMemory
 _init:locale

错误:

 initialize     init后面不可接小写字母
 initwithName   init后面不可接小写字母
 do_init        不以init开头

目前OC有5个方法族

 alloc方法族
 copy方法族
 mutableCopy方法族
 new方法族   以上4种以其开头的方法表示调用者对被创建的对象拥有所有权,返回的对象必须是可以被retain的
 init方法族
版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/zsk_zane

Object-C 指针 和 C 指针的相互转换 与ARC 并验证__bridge关键字的作用

引子 zai
  • ChSaDiN
  • ChSaDiN
  • 2014年07月29日 18:18
  • 6126

Block的引用循环问题 (ARC & non-ARC)

2010年WWDC发布iOS4时Apple对Objective-C进行了一次重要的升级:支持Block。说到底这东西就是闭包,其他高级语音例如Java和C++已有支持,第一次使用Block感觉满简单好...
  • wildfireli
  • wildfireli
  • 2014年03月25日 14:56
  • 37105

Objective-C(十五、内存管理,MRC,循环引用,dealloc和setter方法)——iOS开发基础

内存管理的基础知识,内存泄露,将是对象,野指针,空指针的理解; 引用计数的理解; 基于引用计数的内存管理方法的理解; 循环引用说明以及解决方法; dealloc和setter的更安全写法;...
  • Zsk_Zane
  • Zsk_Zane
  • 2015年07月08日 22:23
  • 1803

objective-C 的内存管理之-自动释放池(autorelease pool)

如果一个对象的生命周期显而易见,很容易就知道什么时候该new一个对象,什么时候不再需要使用,这种情况下,直接用手动的retain和release来判定其生死足矣。但是有些时候,想知道某个对象在什么时候...
  • khlljm
  • khlljm
  • 2015年03月24日 11:43
  • 299

objective-C 的内存管理之-自动释放池(autorelease pool)

如果一个对象的生命周期显而易见,很容易就知道什么时候该new一个对象,什么时候不再需要使用,这种情况下,直接用手动的retain和release来判定其生死足矣。但是有些时候,想知道某个对象在什么时候...
  • bask2009
  • bask2009
  • 2013年07月17日 18:42
  • 412

objective-C 的内存管理之-自动释放池(autorelease pool)

// 解析完成时调用的块代码“类型” typedef void(^parserCompletionBlock)(NSArray *xmlList);...
  • fenglinxiu2008
  • fenglinxiu2008
  • 2014年04月12日 22:06
  • 521

objective-C 的内存管理之-自动释放池(autorelease pool)

转自:http://stephen830.iteye.com/blog/1461354 如果一个对象的生命周期显而易见,很容易就知道什么时候该new一个对象,什么时候不再需要使用,这种情况下,直...
  • song_hui_xiang
  • song_hui_xiang
  • 2013年07月22日 13:18
  • 660

IOS内存管理,ARC,MRC,自动释放池(基础)

在IOS中内存管理几乎是每个人必须知道的一个知识点。首先我们总结一下MRC,再通过MRC来认识ARC以及自动释放池 1.MRC 1.1 淘汰的技术 1.2 引用计数(RC)是指alloc自动分配...
  • lee727n
  • lee727n
  • 2017年04月26日 21:25
  • 261

iOS内存管理之:引用计数、ARC、自动释放池autoreleasepool和便捷方法之间的关系

当我们使用alloc、new或者copy的我们需要销毁这个对象。release函数,只是将对象的retainCount值减1,并不是删除对象。当retainCount==0的时候,系统会发给对象一个d...
  • wutiyixin
  • wutiyixin
  • 2014年04月26日 10:30
  • 1112

iOS内存管理之:引用计数、ARC、自动释放池autoreleasepool和便捷方法之间的关系

部分内容摘自《Objective-C基础教程》和互联网 引用计数        Cocoa采用了引用计数(reference counting)机制,每一个对象有一个关联的“整数retainCount...
  • hherima
  • hherima
  • 2013年04月09日 18:12
  • 16624
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Objective-C(十六、内存管理,自动释放池,ARC,强指针,弱指针,方法族)——iOS开发基础
举报原因:
原因补充:

(最多只允许输入30个字)