首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络基础 >

objc内存储器管理 alloc dealloc retain release

2013-04-20 
objc内存管理 alloc dealloc retain releasealloc dealloc ,? 为对象分配一片内存空间 为对象释放一片内存

objc内存管理 alloc dealloc retain release
alloc dealloc ,? 为对象分配一片内存空间 为对象释放一片内存空间,但是我们的代码中都不会实用dealloc方法, 因为运行时回为你调用此方法释放内存空间,而我们需要做的就是引用技术。

除了alloc dealloc 之外还有retain 和 release方法用于引用技术

?

Foo *first = [[Foo alloc] init]; //retainCount为1

Foo *snd = first; // snd也指向了这个对象 retainCount仍然为1

[snd retain]????? //retainCount为2

[first release]? // retainCount为1

?

内存泄露

我们经常会在一个方法中声明对象,看下面这个例子:

这上面这个方法中,我们为myString 和myFoo分配了内存空间。方法执行结束之后,两个变量超出了作用域的范围,所以不再有效。但是这个方法并没有releases这两个对象。所以运行时没有释放这两个变量占据的内存空间。除非你的应用程序结束,否则这两个变量占据的内存空间一直都是不可用的。我们把它称之为内存泄露

-内存泄露,简言之就是向系统申请的内存使用完后仍然不归还,导致内存空间一直是不可用

-内存溢出 就是向系统申请要求分配的内存超出了系统所能给你的, 例如运行一些大型游戏软件,或者是分配的内存不足以存放你要储存的数据

?

为了防止内存泄露。无论什么时候,我们创建一个对象,或者创建一个对象的拷贝,我们都必须通过release方法释放。

-(void) myMethod {  NSString * myString = [[NSString alloc] init]; //retainCount=1  Foo * myFoo = [[Foo alloc] initWithName:myString]; //retainCount=1  NSLog("Foo's Name:%@", [myFoo getName]);  [myFoo release]; //retainCount=0 so deallocate  [myString release]; //retainCount=0 so deallocate  } 

弱引用

看下面的例子:

-(void) myMethod {  //an incorrect method  Foo * myFooOne = [[Foo alloc] initWithName:@"James"]; //retainCount=1  Foo * myFooTwo = myFooOne; //retainCount still 1  [myFooOne release]; //retaincount=0 so deallocated  NSLog("Name:%@", [myFooTwo printOutName]); //runtime error  } 

nyFooTwo指向了Foo对象,但是没有调用retain方法,就是一种弱引用,上面的代码会在运行时报错。因为myFooOne调用release方法。retaincount变成0,运行时,回收了对象的内存空间。

热点排行