您的位置:首页 > 移动开发 > Objective-C

Objective-C-内存管理相关知识

2016-04-26 23:24 429 查看
参考《Objective-C编程全解(第三版)》,对Objective-C知识点进行梳理总结,只是作为参考1、autorelease,自动释放机制 - (instancetype)autorelease; (1)自动释放池的创建 iOS5.0之前MRC(MannulReference Counting) ;
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//进行一系列操作
//此处不可以使用break、return、goto之类的语句
Person *p = [[[Person alloc] init] autorelease];
[pool release];
2011年iOS5.0之后ARC(Automatic Reference Counting);
@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方法族
__________________________________________________
未经允许不得转载 2016-4-26

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  objective-c 编程