iOS 内存管理机制

alloc 与 init 理解

MyClass  *myObj = [[MyClass alloc] init]; =>  MyClass *myObj = [MyClass alloc]; myObj = [myObj init];

alloc 分配了内存给对象,让他不释放,并且把地址返回给指针。但是这块内存不能使用,因为没有被正确的

初始化。init即是对分配的这块内存进行初始化。

[pool release]和[pool drain]的区别

drain 只是用于清除pool中的对象,不会销毁池,release先调用drain方法清理对象,然后再释放自己的内存。

在ARC中使用自动释放池

如果在线程中需要大量分配内存,我们理应添加上自动释放池,以防内存泄露。比如在for循环中要分配大量的内存处

理数据,那么我们应该在for循环内添加自动释放池,在每个循环后就将内存释放掉,防止内存泄露。

NSZone

ARC中不能使用NSZone,NSZone是Apple用来分配和释放内存的一种方式,它不是一个对象,而是使用c语言结构存储了关于对象的内存管理的信息。基本上开发者是不需要去理会这个东西的,cocoa Applicaton使用一个系统默认的NSZone来对应应用的对象进行管理。

深拷贝和浅拷贝

浅拷贝拷贝的是内存地址即指针的拷贝,深拷贝拷贝的是对象的具体内容,从新开辟一块内存存储,与原对象互不影响。

例:NSString *name = @"zhou";    NSString *newName = [name copy];

NSLog(@"name:%p",name);   NSLog(@"newName:%p",newName);

打印的俩个地址是一样的。(注意:打印指针的值是一样的,打印指针的地址是不一样的。NSLog(@"name:%p",&name)这样打印的结构是不一样的,因为copy浅拷贝是拷贝的指针,也就是说从新生成了一个指针,所以俩个指针的地址是不一样的。)



你可能感兴趣的:(iOS 内存管理机制)