• 进击的Objective-C-------------内存管理


    内存
    1.内存管理问题
    1⃣️:内存溢出:超出系统分配的内存
    2⃣️:野指针异常:[p release];(释放内存)p = nil;(释放指针)
    3⃣️:内存泄漏:Person *p2 = [p1 retain];
    2.内存管理方式
    1⃣️:垃圾回收:
    系统来判断哪些空间不再被使⽤用,并回收这些内存空间,以便再次分配
    2⃣️:MRC(Manual Reference Count)手动引用计数
    内存的开辟和释放都是要由程序员通过代码手动开辟和释
    3⃣️:ARC(Auto Reference Count)自动引用计数
    允许程序员手动开辟,由编译器通过默认的代码帮助释放,但不是垃圾回收
    3.内存管理机制-引用计数
    1⃣️:+alloc
    ①开辟空间
    ②引用计数从0变1
    代码:
    Person *per1 = [[Person alloc]init];NSLog(@"%lu",[per1 retainCount]);
    2⃣️:-retain
    引用计数加1(找个指针指向它,防止出现内存泄漏)
    代码:
    Person *per3 = [per2 retain]; NSLog(@"%p",per2);NSLog(@"%p",per3);
    3⃣️:-copy
    4⃣️:-release
    引用计数减1
    代码:
    [per2 release];NSLog(@"%lu",[per2 retainCount]);如果到0就不要在释放了,过度释放会造成崩溃
    5⃣️:dealloc
    代码:
    当引用计数变为0时系统自动调用
    - (void)dealloc{// 重写父类的dealloc的方法
    [_name release];[_gender release];NSLog(@"被释放了");
    [_age release];// assign是标量非对象类型,没有对引用计数产生影响 无需释放
    [super dealloc];}
    6⃣️:-autorelease和autoreleasepool
    -autorelease:在未来的某个时刻引用计数减1
    autoreleasepool:自动释放池是一种栈的结构,先进后出
    autorelease   @autoreleasepool{}
    4.内存管理原则:
    谁污染谁治理,谁开辟谁释放
    注意:
    1 retain count 只是为了教课和做题用,但实际上对开发无作用,不要用
    2 即使要用的话,不要用它打印系统自带的对象类
    3 以后写MRC的工程,无需写(对象 retain)[对象 copy]的方法要注意 alloc之后要release 或者 autorelease然后指针指向nil 在.m写完整dealloc的方法
    5.copy
    1⃣️main.m
            Person *p1 = [[Person alloc]init];
            Person *p2 = [p1 copy];// [p1 retain]浅拷贝
            NSLog(@"%p",p1);
            NSLog(@"%p",p2);
            [p1 release];
            [p2 release];
            p1 = nil;
            p2 = nil;
    2⃣️浅拷贝
    - (instancetype)copyWithZone:(NSZone *)zone{
        // self retain 把引用计数加1
        return [self retain];//浅拷贝:相当于只拷贝了指针
    //(retain 只不过它遵循了nscopying协议)
        // 指向新的内存}
    3⃣️深拷贝
    - (instancetype)copyWithZone:(NSZone *)zone{
        Person *p = [[Person alloc]init];
       p.name=self.name;
        return p;}
        // 深拷贝:新建了一个对象,将对象return出去
        // 真正意义上的拷贝,他是开辟了一个新的空间 对象也return过去
     
    注意:
     NSLog(@"%lu",NSUIntegerMax);// 18446744073709551615
  • 相关阅读:
    Android中TextView设置下划线
    BottomSheetDialogFragment 如何设置高度和禁止滑动(Kotlin)
    [iOS]使用GCD创建定时器
    [iOS]定时器NSTimer、CADisplayLink的内存管理
    [iOS]dispatch_after()中self和weakself的使用
    [Flutter]在Mac上安装Flutter运行环境
    wx小程序反编译为js代码
    Android | 玩转AppBarLayout,设置scrollFlags滑动属性详解
    玩转微信 | 炫酷的聊天满屏掉爱心系列,赶紧收藏
    Android使用更简单的方式实现滑块拼图验证码功能
  • 原文地址:https://www.cnblogs.com/sharkHZ/p/4984003.html
Copyright © 2020-2023  润新知