目前我作为一个初学者,在内存管理方面看视频也看了好多遍了,但是还是有点稀里糊涂的,所以如果下面所写的内容如果有错,请大家纠正。
在OC中内存管理的机制有2种:ARC和MRC
ARC:Automatic Reference Counting 自动引用计数 (在xcode中一般默认的是ARC)
MRC:Manual Reference Counting 手动引用计数
如何开启MRC:在选择文件标签界面->选择相应目标标签->build setting-> 选择all-> 搜索automatic r->选择NO 表示关闭自动引用计数
内存管理不当造成的后果:
1、不再使用对象没有被回收,内存泄露,最终导致程序闪退
2、正在被使用对象被释放了,野指针,访问野指针就会导致程序崩溃
代码中引用计数是如何增减的?
1、当一个对象被创建的时候,它的引用计数 1
2、当对象上引用计数是0的时候,系统立即把它回收,会调用dealloc方法。
3、release方法 引用计数-1
4、retain方法 引用计数+1
5、retainCount方法 返回当前的引用计数
</pre></p><p class="p1"><pre name="code" class="objc">#import <Foundation/Foundation.h>//------main
#import "LSPerson.h"
//在运行下面程序的时候,首先开启手动引用计数
int main(int argc, const char * argv[]) {
LSPerson *per = [[LSPerson alloc] init];//当一个对象被创建的或者说alloc了,引用计数为1
NSLog(@"%zd",[per retainCount]);//计数=1
[per retain];//retain方法 引用计数+1
NSLog(@"%ld",[per retainCount]);//计数=2
[per release];//计数-1
NSLog(@"%zd",[per retainCount]);//计数=1
[per release];//计数-1
NSLog(@"%zd",[per retainCount]);//计数=1 这里其实计数已经为0了,是编译器为了提高编译速度,编译器不会动态的去检测。可以重新dealloc方法去检验是否被回收。
// 如何开启动态检测:左键点击运行标签框下面的edit scheme-> run->diagnostic标签->enable zombie object前面打上√
//当一个指针指向 nil,这个指针我称为空指针,做了一个清空指针的操作
//给空指针发送消息系统不会报错,它什么都不做
per = nil; //清空指针,很重要
[per test];//当清空指针后,无论你调用什么方法,不会报错,也没有反应
NSLog(@"%zd",[per retainCount]);//计数0
return 0;
}
#import <Foundation/Foundation.h>//------LSPerson.h
@interface LSPerson : NSObject
- (void) test;
@end
#import "LSPerson.h"//------LSperson.m
@implementation LSPerson
- (void) test
{
NSLog(@"CZPerson");
}
-(void)dealloc{ //只有内存被回收了才会调用这个方法
NSLog(@"%s",__func__);//__func__输出的是类名和调用的方法名
[super dealloc];//这个方法中必须调用父类该方法,并且必须放在最后表示内存被回收了,如果不调用父类的dealloc的方法,这个内存是不会被系统回收的
}
@end