A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 程序猿-2014 中级黑马   /  2014-4-13 23:57  /  1517 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 程序猿-2014 于 2014-4-14 22:52 编辑

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

如果我要把这个的内存释放了该怎么做呢     求大神解惑   最好能详细点

评分

参与人数 1黑马币 +1 收起 理由
jing迪 + 1

查看全部评分

4 个回复

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

评分

参与人数 1黑马币 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
  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
复制代码

评分

参与人数 1黑马币 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 FlyTrem 于 2014-4-14 09:22 编辑

非ARC情况:
Student *s = [[Student alloc]init]; // 新对象且指针s指向它
NSArray *arr = [NSArray arrayWithObject:s]; // 对象被引用,arr指针指向了s的地址,对象被两个指针指着
[s release]; // 被释放了一次,引用计数器还是一

评分

参与人数 1黑马币 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
先把ARC关了,然后就可以跟你那么写的做了-。-
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马