内存管理
作者:互联网
OC中的内存管理
alloc+init 方式创建对象, 一般情况下在堆上上,使用完一定要释放
手动内存管理
自动内存管理(自动引用计数-ARC)
如何内存管理方式切换到手动内存管理?
工程配置–>TARGETS->Build Setting-> 搜索 counting, 设置为NO
内存管理中常用的方法
alloc+init
//1.alloc+init
//alloc: 为对象申请空间,把这块空间全部初始化为0
//alloc申请的对象一般情况下都在堆空间,必须考虑释放的问题
//init 初始化这个对象
Dog *princess = [[Dog alloc] init];
dealloc+release
retain+retainCount
引用计数这种内存管理方式
//获取对象被使用的次数
NSLog(@”count=%lu”,princess.retainCount);
//以后内存管理中有问题的
//retain: 让对象引用次数+1
//retain的对象也要release
[p release];
NSLog(@”count=%lu”,princess.retainCount);
//释放放在最后
//release作用:
// 如果retainCount>1 说明有多个人在使用这个对象,不会释放,对象引用次数-1
// 如果retianCount==1
// 最后使用的”人”释放这个对象
// 调用dealloc真正释放对象
[princess release];
NSMutableString str = [[NSMutableString alloc] initWithString:@”的麻烦了看什么地方了开始免费立刻马上离开父母萨洛克没放到里面是打发来看马萨拉蒂方面撒地方可拉伸的佛罗伦萨地方了”];
//特别值得注意的问题
// 最好千万不要在对象release之后使用对象
//什么是释放:
// 释放是失去了这块内存的使用权(内存还在)
// 一旦释放, 别人有可能使用这块内存
// 咱们在使用的就会出现问题
//[princess show];
copy+mutableCopy
//问题:
// retain两个指针, 只有一个对象
// copy复制这个对象
// 效果: 两个指针指向不同的对象
// copy 返回不可变对象
// mutableCopy返回可变对象
NSMutableString pname = [name mutableCopy];
内存管理原则:黄金法则
如果你对一个对象使用了 alloc,retain,copy/mutableCopy, 使用完这个对象之后需要调用对应的realese或autorelease
代码中alloc和release成对出现的retain和release也是成对出现的代码中出现的各种内存管理情况
(0)如果在方法内部定义了一个对象指针,指向了alloc申请的对象
需要在方法结束前释放这个对象
init中为对象指针(类的实例变量)的申请对象
需要在dealloc方法中释放 (重点)
//需求: 创建车的同时添加引擎
-(id)init
{
if(self = [super init])
{
//考虑到释放问题
//类中对象指针一般在init中申请对象
// 在dealloc中释放对象
_e 大专栏 内存管理ngine = [[Engine alloc] init];
//NSString *str = [[NSString alloc] init];
//[str release];
}
return self;
}
-(void)dealloc
{
NSLog(@”Car dealloc”);
[_engine release];
//这句放在最后
[super dealloc];
}
对象指针的setter方法
//_engine实现设置方法
-(void)setEngine:(Engine *)engine
{
//以前的写法
//_engine = engine;
//传入的指针和保存指针相同,返回即可
if(_engine == engine)
{
return;
}
//旧的对象不用了, 立即释放
[_engine release];
//多一个指针指向engine对象
//引用次数+1,调用retian方法
_engine = [engine retain];
}
对象指针的getter方法
//_engine实现获取方法
-(Engine *)engine
{
//以前的实现
//return _engine;
//retain: 返回的对象类外的指针指向, 多了一个使用, 引用+1
// autorelease谁使用,谁释放
// 不能用release, 立即使用
return [[_engine retain] autorelease];
}
各种实例变量的property (重点)
//使用property实例变量添加getter和setter
// 一般情况, NSString 使用copy作为属性修饰符
//copy, 把传入的字符串拷贝一个份新的
//字符串,字典,数组用copy最好
@property (copy) NSString type;
//assign表示直接赋值, 不retain也不copy
// 默认是assign, assgin可以不写
//@property (assign) float price;
@property float price;
//retain表示实现的setter中添加retain,getter也会添加retain
@property (retain) Engine engine;
//代理设计模式中
// 代理的属性修饰符必须是assgin,不能是retain,否则会引起无法释放的问题
@property (assign) id delegate;
取消线程保护 nonautomic
//nonatomic取消多线程保护
//1.什么是多线程(多任务)
// 迅雷下载(界面响应用户点击,下载数据)
//2.为啥要加这一句啊
// 多线程保护比较耗时, 取消提供代码速度
@property (nonatomic) float speed;
类方法创建对象如何写?
//类方法创建的对象无需释放, 也不能释放
创建对象的方法,类方法
+(id)car
{
//干两件事情
Car *car = [[Car alloc] init];
//if(car)
//{
//设置car的属性
//}
//alloc和autorelease对应起来
return [car autorelease];
}
数组中的添加对象内存管理 NSArray
//数组被释放的时候会给数组中每个对象发送release
[array release];
字符串的内存管理
// 特点: 特立独行,有性格
//字符串常量的引用数是极大值,不需要释放
//总结:
以alloc创建的字符串最后使用release释放
字符串常量和以类方法创建的字符串不需要释放
标签:engine,alloc,管理,对象,内存,release,retain 来源: https://www.cnblogs.com/lijianming180/p/12239778.html