iOS开发学习第二十二课——内存管理
来源:互联网 发布:java 0x 转换 int 编辑:程序博客网 时间:2024/06/02 06:50
OC中堆区常见的三种错误:
1. 过度释放:对一个对象释放了不止一次
2. 野指针:访问没有所有权的内存,如果想要访问就必须要保证内存还在(也就是指针指向了一个无效的内存)
3. 内存溢出:开辟的内存没有得到及时的释放,也就是在使用完内存之后没有及时释放内存
OC 当中内存管理方式:ARC / MRC
ARC: 自动引用计数(自动管理内存) 由开发人员开辟空间,但是由系统自动释放内存,本质还是基于MRC,这是系统默认的内存管理方式,也是苹果推荐使用的方式
MRC: 手动引用计数(手动管理内存) 由开发人员开辟空间,在使用完对象之后由开发人员手动及时释放内存;;;;比起ARC的好处就是能够灵活地控制空间何时释放
内存管理机制:采用引用计数机制
影响引用计数的几个方法:
1.alloc 在堆区开辟内存,空间从无到有,引用计数由0到1
2.retain 将原有的对象的引用计数+1
3.copy 拷贝出一个新的对象,将新的对象引用计数+1,原有的对象的引用计数不变
4.release 将原有的对象的引用计数-1
5.autorelease 在将来的某一个时刻会将引用计数-1
#import
#import "Person.h"
int main(int argc, const char * argv[]) {
int main(int argc, const char * argv[]) {
}
Person.h
***************************
#import
@interface Person : NSObject<</span>NSCopying>//遵守NSCopying协议
@property (nonatomic ,retain)NSString *name;
@property (nonatomic ,retain)NSString *sex;
@property (nonatomic ,assign)NSInteger age;
@property (nonatomic ,retain)NSString *name;
@property (nonatomic ,retain)NSString *sex;
@property (nonatomic ,assign)NSInteger age;
@property (nonatomic ,assign)CGFloat score;
- (void)dealloc;
@end
***************************
Person.m
#import "Person.h"
@implementation Person
//实现NSCopying里的方法
- (id)copyWithZone:(NSZone *)zone{
//开辟一份新的空间,与原对象所开辟的空间一样
//zone:原有对象的空间的大小
//第一步:创建一个新的对象
Person *per = [Person allocWithZone:zone];
//第二步:将原有对象的内容拷贝到新的空间上(也就是为新的对象赋值)
per. name = self.name;
per. age = self.age;
per. sex = self.sex;
per. score = self.score;
//将新对象返回即可
return per;
}
//销毁方法,当前该类的对象的引用计数为零时则会自动调用,用来回收对象的空间
- (void)dealloc{
NSLog(@"oh my god!,我被销毁了!");
//调用父类该方法,销毁对象内存,此时才是真正回收内存
[ super dealloc];
//实现NSCopying里的方法
- (id)copyWithZone:(NSZone *)zone{
}
//销毁方法,当前该类的对象的引用计数为零时则会自动调用,用来回收对象的空间
- (void)dealloc{
}
@end
0 0
- iOS开发学习第二十二课——内存管理
- iOS开发学习笔记三 —— 内存管理
- iOS开发经验总结—内存管理
- iOS开发系列—内存管理
- iOS开发经验总结—内存管理
- ios开发-OC内存管理的学习
- 黑马程序员——零基础学习iOS开发——11 OC内存管理
- 【IOS 开发学习总结-OC-24】★★★objective-c——内存管理
- iOS开发-内存管理
- iOS开发内存管理
- iOS开发内存管理
- IOS开发-内存管理
- iOS开发-内存管理
- iOS开发------内存管理
- iOS开发内存管理
- iOS开发 - 内存管理
- iOS开发学习手动内存管理暂时抛弃ARC以及retain/assign知识——iOS工程师面试必考内容
- iOS开发学习第十一课——动态内存分配
- 手把手教你:解决pynlpir在ubuntu下不能分词的问题
- 学期项目类图
- 用maven创建web工程遇到的问题
- PreparedStatement不能用来设置表名、字段名
- UIEdgeInsetsMake 和 UIEdgeInsetsMake
- iOS开发学习第二十二课——内存管理
- POJ3067:Japan(树状数组求逆序对)
- 再见初恋
- RedHat Linux 安装JDK、Maven、Jboss
- Android开发之Intent
- 自定义双向动态密码简介
- 基于卷积神经网络的数据预处理以及模型参数保存
- 火狐的旺旺和支付宝控件总是需要反复点击确认?
- nefu 520