黑马程序员技术交流社区

标题: OC main函数里 @autoreleasepool 有什么作用了 [打印本页]

作者: 天使爱恋。。    时间: 2015-4-25 17:43
标题: OC main函数里 @autoreleasepool 有什么作用了
视频中老师没有提到很是好奇啊

作者: stonelv0101    时间: 2015-4-25 20:38
@autoreleasepool是ARC机制出现后才有的,是自动释放池,用来释放手动创建的对象的。当用户出发事件后,就会产生事件循环,事件循环开启后,系统会创建自动释放池,准备好,用来释放程序中创建的对象,当事件要结束时,自动释放池会清空其中的对象,然后自动销毁。ARC大大减少了程序猿对内存的管理。
作者: 天使爱恋。。    时间: 2015-4-25 23:34
stonelv0101 发表于 2015-4-25 20:38
@autoreleasepool是ARC机制出现后才有的,是自动释放池,用来释放手动创建的对象的。当用户出发事件后,就 ...

不错,学习了,谢谢解答
作者: shuizhuqing    时间: 2015-4-29 00:08
应该是对池中的对象引用统一做一次release操作,
作者: 冰儿    时间: 2015-4-29 21:36
autoreleasepool自动释放池,通过自动资源释放池来管理对象,只需要一个自动释放池就可以管理很多对象,当自动释放池结束的时候,会自动向池中的每个对象都发送release消息。
作者: pangang    时间: 2015-4-29 23:26
还没看到这里,加油了
作者: lucky_francis    时间: 2015-4-29 23:53
内存管理在Xcode中减少多了呀
作者: shenxian88    时间: 2015-4-30 00:54
@autoreleasepool
{

}
这是一个自动释放池,只要是放在花括号里面的对象,在函数运行到第二个花括号结束,自动释放池就会自动销毁,然后将里面的所有对象做一次release操作,如果对象是在花括号外面,那么自动释放池对它没有作用
作者: 临汾皮皮    时间: 2015-5-3 16:16
都说的很好,创建一个自动销毁池子,然后再代码结束的时候对内部的对象做一次re le se,只是对对象的计数器减一,并不会销毁对象。
作者: 50mmf1.0    时间: 2015-5-3 17:52
用了ARC不是会自动做retain和release操作么。
ARC下加了@autoreleasepool和不加有什么区别?
作者: Dove丶凡    时间: 2015-5-3 18:14
好厉害的感觉啊
作者: kailee    时间: 2015-5-3 18:24
50mmf1.0 发表于 2015-5-3 17:52
用了ARC不是会自动做retain和release操作么。
ARC下加了@autoreleasepool和不加有什么区别? ...

autoreleasepool是延迟了release,因为它要等到池子销毁,才执行release操作。而ARC的工作原理是:只要没有强指针指向对象,就会释放对象。
可以看看这篇文章:http://www.onevcat.com/2012/06/arc-hand-by-hand/
希望对你有帮助!
作者: kailee    时间: 2015-5-3 18:29

autorelease:
1.autorelease 返回值是id,返回对象本身。
2.autorelease 会将对象放到一个自动释放池,不是自动释放
3.当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
4.@autoreleasepool{}从大括号开始代表创建了一个释放池,大括号结束代表销毁释放池
5.自动释放池可以创建无限多个
6.autorelease对对象计数器没有任何改变,只有大括号结束才调用release,改成0,释放
7.这些池子实际上是以栈的形式存放的(先进后出)
8.使用自动释放池后,省去了,对象调用必须写在release前的烦恼(不必关心它什么时候释放)
9.但是不能精确控制对象销毁时间,适用于占用内存比较小的数据,占内存大的不要乱用它
10.注意事项:
10.1.已经调用了autorelease的对象又调用release,会发生野指针错误
@autoreleasepool
{
        Person *p = [[[Person alloc] init] autorelease];
        [p release];
}
10.2.同样连续多次调用autorelease,也会发生野指针错误
@autoreleasepool
{
        Person *p = [[[[Person alloc] init] autorelease] autorelease];
}

11.在IOS程序运行过程中,会创建无数个池子。这些池子都是以栈结构存在(先进后出)
12.当一个对象调用autorelease方法时,会将这个对象放到栈顶的释放池
13.ios5.0之前
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Person *p = [[[Person alloc] init] autorelease];
p.age = 10;
int a = p.age;
NSLog(@"age=%d", a);
[pool release];
希望对你有帮助!




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