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,运行时,回收了对象的内存空间。