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

本文详细探讨了iOS开发中内存管理的核心概念,包括内存溢出、野指针异常、内存泄漏等常见问题,以及垃圾回收、MRC、ARC等管理方式。重点介绍了引用计数机制及其操作方法,如+alloc、-retain、-release等,并阐述了内存管理原则。此外,还讨论了内存管理机制中的copy操作和autorelease机制的应用。
内存
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

转载于:https://www.cnblogs.com/sharkHZ/p/4984003.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值