11.7 星期四 主要学习笔记
(注:本文极为不严谨)
本文将介绍关于ios中的内存管理知识:
许多时候在不支持ARC的情况下需要我们自己管理内存:其实再没有ARC之前 内存一直需要我们自己管理
在早期的ios中苹果公司只给我们很少一部分内存来运行程序;一旦超过这个数值就会出现"crash"也就是常说的闪退;
于是合理管理内存成为每个ios程序员的必修课,下面将作为入门课程为你讲解如何管理内存;
首先作为一门面向对象语言,实例化oc下的类时,我们需要在堆中为它分配一部分内存来存储;通常我们用alloc
例如:Person * p=[ [Person alloc] init ];这里我们做了三步操作:
- 在堆中开辟一片空间:实际操作是:将Person类的实例变量(注意:方法没有拷贝)拷贝了一份放在堆中;
- 初始化刚才的各种实例变量
- 把这片空间的地址存放到指针变量p中;
ok 现在我们来看第一种释放内存的方法:[p release];执行完这行代码的时候刚才申请的那片空间就释放掉了
看起来很简单对吧 那么让我们看看内部是怎么运作的呢,我们都知道在分配在堆上的这些对象的内部都会有一个计数器,这就是oc中有名的Retain Count(引用计数) 当我们执行alloc的时候其变为1,retain的时候执行加一;
........
下面我们看一下系统的内部处理以便更深刻的理解:
首先当我们的RC变为0的时候release将会自动执行dealloc方法
具体实现
(..) release
{
if(RC>1)
{
R C--;
}
else{[ self dealloc]
}
}
然后是属性的实现
assign 直接赋值 适用于基本数据类型;(不带*号的)
{
_name=name;˚
}
retain 赋值时做内存的you'hua优化 (适用于du对象类型)(带*)
{
if(_name!=name)
{
[_name release];
_name=[name retain];
}
}
copy复制一个副本(特殊的...内部有n'sstrcoping)
{
if(_name@!=name)
{
[_name release];
_name=[name copy];
}
}
也就是说在属性@property (nonatomic,retain)Person* per;
相当于对set方法中的传进来的值进行一次retain操作于是乎在dealloc中要进行一次release操作
即重写dealloc方法;
-(void)dealloc
{
对象属性 release;
[super dealloc]; (这里调用super的dealloc方法是因为上面已经吧自己的对象属性给处理掉了 然后再去调用父类的dealloc去处理继承过来的对象方法)
}
ok现在 第三种;
便利构造器:
-(id)initWithSpeed:(int)speed
{
if (self=[super init]) {
[self setSpeed:speed] ;
}
returnself;
}
+(id)carWithSpeed:(int)speed
{
Car * car = [[Car alloc]initWithSpeed:speed];
[car autorelease];
return car;
}
这里我们只能用autorelease去释放他
ok.....