黑马程序员技术交流社区
标题:
自动释放池和autorelease
[打印本页]
作者:
杨勇
时间:
2014-5-1 13:11
标题:
自动释放池和autorelease
本帖最后由 杨勇 于 2014-5-7 10:09 编辑
系统自带的方法中,如果不包含alloc new copy等,则这些方法返回的对象都是autorelease的,如[NSDate date];自动释放池的创建格式如下:
@autoreleasepool
{
````
}
那如果一个程序中不这样显式的用代码表明这是一个自动释放池,是否默认整个主函数是一个大的释放池还是怎么的?什么时候释放对象呢?谢谢
作者:
ios_fce
时间:
2014-5-1 15:14
#前提:没有使用ARC
是否默认整个主函数是一个大的释放池还是怎么的?
:主函数如果不写@autoreleasepool
{
````
},就没有自动释放池,还有autorelease要和释放池一起使用,单独使用其中一个是没用的,autorelease的作用是自动释放池销毁时让池里面的对象自动调用一次release,有autorelease但没有池不起效(没有池就意味着没有池的销毁,没有池的销毁,怎么让每个对象调用release),有池没有autorelease(池销毁后,不会让每个对象自动调用release方法,因为没有autorelease);
什么时候释放对象呢?
当池销毁时,释放对象。
作者:
ios_fce
时间:
2014-5-1 18:38
#前提:使用了ARC
@autoreleasepool
{
````
},这个池还是要添上,对象初始化时封装了autorelease方法
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
// 对象创建在池内的情况
Person *p = [[Person alloc] init];
p = nil; // 如果这句写上,则这句执行之后对象就被释放了(没有了强指针);如果不写,则在执行18之后释放对象
NSLog(@"abc");
} // (如果 前面 p = nil没写)则对象要在执行当前行之后释放,因为使用ARC,他封装了autorelease(也只能在有池情况下使用有效)
// 对象创建在池外
Person *p1 = [[Person alloc] init];
p1 = nil; // 如果这句写上,则这句执行之后对象就被释放了(没有了强指针),如果不写,则要在main函数执行完后释放对象(原因:main函数执行后局部变量消失,即对象没有强指针了,即p1不存在了)
NSLog(@"456");
return 0;
}
复制代码
作者:
ios_fce
时间:
2014-5-1 18:39
写错了,上面那个对象在12行执行之后释放对象。。。。。。。。。。。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2