黑马程序员****OC语言基础****MRC的理解

Java开发与内存管理实践
本文深入探讨了Java中的内存管理机制,通过实例分析MRC(Manual Reference Counting)原理,展示如何在对象销毁时自动调用dealloc方法,并正确处理多对象引用。以Person和Car类为例,详细阐述了如何在类间传递对象并合理管理引用计数,避免内存泄露,确保程序高效稳定运行。

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

       概念:

       MRC:MannulReference Counting ( 手动管理 ) 

         对引用计数器的操作 :
         
retain消息:使计数器+1,该方法返回对象本身

         release消息:使计数器-1(并不代表释放对象)

         retainCount消息:获得对象当前的引用计数器值

         当一个对象的引用计数器为0时,那么它将被销毁,其占用的内存被系统回收。

         当对象被销毁时,系统会自动向对象发送一条dealloc消息,一般会重写dealloc方法,在这里释放相关的资源,dealloc就像是对象的“临终遗言”。

         一旦重写了dealloc方法就必须调用[super dealloc],并且放在代码块的最后调用(不能直接调用dealloc方法)。 

          

        Person.h声明:

       

<span style="font-size:24px;">#import <Foundation/Foundation.h>
@interface Person : NSObject 
@property int age;
@end</span>

        Person.m实现:

<span style="font-size:24px;">#import "Person.h" 
@implementation Person
//重写dealloc方法 
-(void)dealloc{
//释放子类对象
NSLog(@"对象被销毁了~"); 
//释放父类
[super dealloc];
}
@end</span>


        main.m主函数:


<span style="font-size:24px;">#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
    Person *p = [[Person alloc] init];
    NSLog(@"p的retainCount = %ld",p.retainCount);
    Person *p1 = [[Person alloc] init];
    NSLog(@"p1的retainCount = %ld",p1.retainCount);
    [p1 retain];
    NSLog(@"p1的retainCount = %ld",p1.retainCount);
    [p1 release];
    NSLog(@"p1的retainCount = %ld",p1.retainCount);
    [p1 release];   //此时p还没释放,造成内存泄露了
    return 0;
}</span>


          运行结果: p retainCount = 1

           p1retainCount = 1

           p1retainCount = 2

           p1retainCount = 1

           对象被销毁了~


          实例分析:凤姐去拉萨多对象处理

         Person.h声明:

 

<span style="font-size:24px;">#import <Foundation/Foundation.h>
#import "Car.h"
@interface Person : NSObject{
    Car *_car;
}
-(void)dealloc;
-(void)goLasa;
-(void)setCar:(Car *)car;

@end</span>

        Person.m的实现:


<span style="font-size:24px;">#import "Person.h"

@implementation Person
-(void)dealloc{
    [_car release];     //在人对象释放前,先释放掉车的对象
    NSLog(@"人已经挂了!");
    [super dealloc];
}
-(void)goLasa{
   
    [_car run];  //插入车的跑方法
}
/*此处会有一个新的问题:
  如果此时并未出现新的对象,而是旧的对象,如果没有判断的话
  此时旧的对象会变成僵尸对象,程序则会出错。
*/
-(void)setCar:(Car *)car{
    if(_car != car){
    [_car release];       //为了防止车的多对象产生内存泄露,在retain之
                          // 前释放掉当前对象
    _car = [car retain];  //给人的对象设置车时,再次增加一次车的retain

    }
    }
@end</span>

      Car.h声明:


<span style="font-size:24px;">#import <Foundation/Foundation.h>

@interface Car : NSObject/*{
    int _speed;
}*/
@property int speed;
-(void)dealloc;
//-(int)setSpeed:(int)speed;
//-(void)getSpeed;
-(void)run;

@end</span>

      Car.m的实现:


<span style="font-size:24px;">#import "Car.h"

@implementation Car
-(void)dealloc{
    NSLog(@"速度为 %d 码的车已经挂了",_speed);
    [super dealloc];
}
/*-(int)setSpeed:(int)speed{
    _speed = speed;
    return speed;
}
-(void)getSpeed{
    
}*/
-(void)run{
NSLog(@"汽车正以%d码的速度奔向拉萨",_speed);
}

@end</span>

        main.m主函数:


<span style="font-size:24px;">#import <Foundation/Foundation.h>
#import "Car.h"
#import "Person.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *fj = [Person new];//此时fj的retainCount就变成了1;
        Car *bmw = [Car new];//此时bmw的retainCount就变成了1;
       
        [fj setCar:bmw];
       // [bmw setSpeed:100];
        bmw.speed = 200;
        
        [fj goLasa];//在setCar中插入了[_car retain]
        [fj goLasa];//此时bmw的retainCount就变成了2;
        [fj goLasa];
        
        NSLog(@"retainCount = %lu",bmw.retainCount);
        [bmw release];//内存管理原则,谁创建谁release
        
        Car *qq = [Car new];
        [fj setCar:qq];
        [qq setSpeed:20];
       // NSLog(@"retainCount = %lu",bmw.retainCount);
        [fj goLasa];
        [fj goLasa];
        [fj goLasa];
        [qq release];
        [fj release];//内存管理原则,谁创建谁release
       // NSLog(@"retainCount = %lu",bmw.retainCount);
        
    }
    return 0;
}</span>

        运行结果: 汽车正以 200 码的速度奔向拉萨

           汽车正以200码的速度奔向拉萨

           汽车正以200码的速度奔向拉萨

           retainCount = 2

           速度为 200 码的车已经挂了  

           汽车正以20码的速度奔向拉萨

           汽车正以20码的速度奔向拉萨

           汽车正以20码的速度奔向拉萨

           速度为 20 码的车已经挂了

           人已经挂了!

        


智慧政务:打造“线上”有温度、“线下”有速度的新体验 在数字化浪潮的推动下,智慧政务正成为政府服务转型的重要方向。通过数据共享与流程优化,智慧政务解决方案致力于解决企业和群众反映强烈的办事难、办事慢、办事繁等问题,实现“一网通办”,让政务服务更加便捷、高效。 一、智慧政务的发展趋势 近年来,随着数字中国战略的深入实施,政务服务正朝着“全国一体化”方向发展。从最初的“可看可查”到如今的“一网通办”,政务服务经历了从互联网+政务服务(省市县)到长三角一体化政务平台,再到区域/全国一体化在线政务服务平台的飞跃。国务院及各级政府积极推进大数据、政务服务改革,明确建设目标、内容和节奏,为智慧政务的发展提供了强有力的政策支持。 二、智慧政务的核心挑战 尽管智慧政务取得了显著进展,但仍面临诸多挑战。跨部门、多流程环节的政务服务中,数据共享时效性差、权责不清成为制约协同效率的主要因素。同时,数据安全管控不足、数据质量问题缺乏责任追溯,也影响了政务服务的可信度和质量。此外,在线办理深度不够、群众认同感不高,以及政务热线服务多样性、便捷性和智能性不足,都是当前智慧政务需要解决的问题。 三、智慧政务解决方案的创新实践 针对上述挑战,智慧政务解决方案通过一系列创新实践,推动政务服务向线上线下一体化方向发展。具体而言,该方案包括以下几个关键方面: “一码通”服务:面向民众和企业,提供行、办、用、管一体化的政务服务。通过“一码通”,群众和企业可以在政务服务大厅及试点事项中,使用电子证照调用授权,实现身份证明、社会保障信息核验、医疗健康一码通办等功能。这不仅简化了办事流程,还提升了用户体验。 “一网通”服务:提供全程网办的政务服务。通过智能预审、远程面审、一窗办理、智能引导等功能,实现政务服务的全流程网上办理。群众和企业可以足不出户,通过政务服务官网、APP、小程序等多种渠道,享受7*24小时全天候的政务服务。 “一号通”服务:作为政务服务智能总客服,通过全媒体接入方式,整合热线、微信、邮件、短信等多种服务渠道,实现一号对外、服务通达。运用人工智能技术,构建自动服务应答体系,提高服务效率和质量。同时,通过大数据分析,及时掌握舆情热点和政情民意,为服务监督和实时决策提供依据。 “协同办”与“协同管”:面向政府工作人员,提供办、查、看、管一体化的工作门户。通过集成门户、工作中心、信息中心、知识中心等功能模块,实现政务工作的统一管理和高效协同。同时,整合监管数据、打通监管业务、感知监管风险,助力监管决策,提升政府治理能力。 四、智慧政务的未来展望 随着新基建的加速推进,5G、AI、工业互联网、物联网等新型基础设施的建设将为智慧政务的发展提供更强有力的支撑。未来,智慧政务将继续深化数据共享与流程优化,推动政务服务向更加智能化、便捷化、个性化的方向发展。同时,通过加强跨部门、跨领域的监管协同,提升政府治理能力和服务水平,为构建数字政府、掌上政府奠定坚实基础。 总之,智慧政务解决方案通过创新实践,正在逐步解决政务服务中的痛点问题,让“线上”服务更有温度、“线下”服务更有速度。随着技术的不断进步和应用的深入推广,智慧政务将迎来更加广阔的发展前景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值