黑马程序员技术交流社区

标题: ios内存管理相关知识,结合自己理解版 [打印本页]

作者: 一笑奈_UTPa1    时间: 2016-1-20 13:55
标题: ios内存管理相关知识,结合自己理解版
  1. /**
  2.     学习课程:内存管理相关内容:arc&mrc
  3.     1、内存管理的对象:对象。基本数据结构不需要内存管理,局部变量在一段代码段结束后会自动清空内存。而对象通过动态分配存储在堆中,即使指向它的指针已经消亡,它仍然存在,造成内存泄露。
  4.     2、在重写dealloc过程中,先释放当前对象的相关资源,最后通过[super dealloc]调用父类的函数去释放父类中相关的资源。遵循设计中自己只做自己的事的原则。
  5. */
  6. #import "Person.h"
  7. #import <Foundation/Foundation.h>

  8. int main(int argc, const char * argv[]) {
  9.     @autoreleasepool {
  10.         // insert code here...
  11.         //先生成一个Person类,并初始化
  12.         Person *per = [[Person alloc]init];
  13.         NSLog(@"per此时的引用计数为%ld",per.retainCount);
  14.         //通过调用release方法让retainCount减一。调用完毕后系统检测到retainCount已经为0了,自动调用dealloc函数
  15.         [per release];
  16.         //此时per对象已经被回收了,(称为僵尸对象),若继续使用,会报野指针错误
  17.         //[per setAge:15];
  18.         //per=nil;//这句话将指针指向空,之后即使执行了类似[per setAge:15];的语句,也不会报错,从而让程序正常执行下去。
  19.         //但是,如果在per release前误将per=nil。会导致内存泄露,因为此时已经丢失了该对象的地址,失去了操作权,即使调用release也没有效果了。
  20.       //  NSLog(@"Hello, World!");
  21.     }
  22.     return 0;
  23. }
复制代码
  1. #import "Person.h"

  2. @implementation Person
  3. //重写继承的dealloc方法
  4. -(void)dealloc
  5. {
  6.     NSLog(@"dealloc被调用,开始回收对象");
  7.     //先释放子类的资源
  8.     //再调用父类的dealloc释放父类的资源。遵循原则,自己处理自己的事情
  9.     [super dealloc];
  10. }
  11. @end
复制代码



作者: zhang洁    时间: 2016-1-21 12:17
谢谢总结,谢谢
作者: Wangyk    时间: 2016-5-7 08:23
概念是有了,所以一般般吧。
内存管理:new、alloc、copy、retain,就必须要autorelease、release(针对一个对象)




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2