OC-023.OC在手动内存管理的引用计数

目前我作为一个初学者,在内存管理方面看视频也看了好多遍了,但是还是有点稀里糊涂的,所以如果下面所写的内容如果有错,请大家纠正。

在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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值