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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨勇 中级黑马   /  2014-5-1 13:11  /  1442 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨勇 于 2014-5-7 10:09 编辑

  系统自带的方法中,如果不包含alloc new copy等,则这些方法返回的对象都是autorelease的,如[NSDate  date];自动释放池的创建格式如下:
@autoreleasepool
{
````
}
那如果一个程序中不这样显式的用代码表明这是一个自动释放池,是否默认整个主函数是一个大的释放池还是怎么的?什么时候释放对象呢?谢谢

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

4 个回复

倒序浏览
#前提:没有使用ARC
是否默认整个主函数是一个大的释放池还是怎么的?
:主函数如果不写@autoreleasepool
{
````
},就没有自动释放池,还有autorelease要和释放池一起使用,单独使用其中一个是没用的,autorelease的作用是自动释放池销毁时让池里面的对象自动调用一次release,有autorelease但没有池不起效(没有池就意味着没有池的销毁,没有池的销毁,怎么让每个对象调用release),有池没有autorelease(池销毁后,不会让每个对象自动调用release方法,因为没有autorelease);

什么时候释放对象呢?
当池销毁时,释放对象。

点评

我的前提是使用了arc,结果呢  发表于 2014-5-1 17:42
回复 使用道具 举报
#前提:使用了ARC
@autoreleasepool
{
````
},这个池还是要添上,对象初始化时封装了autorelease方法

  1. #import <Foundation/Foundation.h>
  2. #import "Person.h"
  3. int main(int argc, const char * argv[])
  4. {

  5.     @autoreleasepool {
  6.         
  7.         // 对象创建在池内的情况
  8.         Person *p = [[Person alloc] init];
  9.         p = nil; // 如果这句写上,则这句执行之后对象就被释放了(没有了强指针);如果不写,则在执行18之后释放对象
  10.         NSLog(@"abc");
  11.     } // (如果 前面 p = nil没写)则对象要在执行当前行之后释放,因为使用ARC,他封装了autorelease(也只能在有池情况下使用有效)
  12.    
  13.    
  14.    // 对象创建在池外
  15.     Person *p1 = [[Person alloc] init];
  16.     p1 = nil; // 如果这句写上,则这句执行之后对象就被释放了(没有了强指针),如果不写,则要在main函数执行完后释放对象(原因:main函数执行后局部变量消失,即对象没有强指针了,即p1不存在了)
  17.      NSLog(@"456");
  18.     return 0;
  19. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
写错了,上面那个对象在12行执行之后释放对象。。。。。。。。。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马