黑马程序员技术交流社区

标题: 内存释放的问题 [打印本页]

作者: 程序猿-2014    时间: 2014-4-13 23:57
标题: 内存释放的问题
本帖最后由 程序猿-2014 于 2014-4-14 22:52 编辑

Student *s = [[Student alloc]init];
    NSArray *arr = [NSArray arrayWithObject:s];
    [s release];

如果我要把这个的内存释放了该怎么做呢     求大神解惑   最好能详细点
作者: 董月峰    时间: 2014-4-14 08:42
先把ARC关了,然后就可以跟你那么写的做了-。-
作者: FlyTrem    时间: 2014-4-14 09:19
本帖最后由 FlyTrem 于 2014-4-14 09:22 编辑

非ARC情况:
Student *s = [[Student alloc]init]; // 新对象且指针s指向它
NSArray *arr = [NSArray arrayWithObject:s]; // 对象被引用,arr指针指向了s的地址,对象被两个指针指着
[s release]; // 被释放了一次,引用计数器还是一
作者: 于清扬    时间: 2014-4-14 09:39
  1. {

  2.     Student *s = [[Student alloc]init];  // retainCount == 1
  3.     // 数组中保存的其实是指向对象的指针,在非ARC中会使对象的引用计数器加1。
  4.     // 但arr是个局部变量,出了大扩号就没了
  5.     NSArray *arr = [NSArray arrayWithObject:s]; // retainCount == 2
  6.     [s release];  // retainCount == 1
  7.    
  8. } // arr 是局部变量,被销毁  retainCount == 0
复制代码

作者: yaozeyang_2014    时间: 2014-4-14 15:13
这个student对象s在创建的时候计数器+1,在数组那里被调用也会加1,但是因为数组是内部的类,使用的是静态方法,数组调完后自动释放一次,也就是计数器会减一,最后你也来了一个[s release],所以这是没有内存泄漏的,符合内存管理原则,谁创建谁释放




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