首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

AutoreleasePool

但是AutoreleasePool仍然在背后默默发挥着作用,并且有些场景下我们还是需要显式用到它,今天我们就来聊一聊AutoreleasePool。...使用形式 // OC @autoreleasepool { // 生成自动释放对象 } // swift autoreleasepool { // 生成自动释放对象 } 基本原理...,加入 AutoreleasePool; 我们其实可以通过objc_autoreleaseReturnValue函数来标识一个对象是否加入到AutoreleasePool中去。...在 Xcode11 之前,是将整个应用程序运行放在 @autoreleasepool 内,由于 RunLoop 的存在,理论上这里的@autoreleasepool有点像摆设,根本没有发挥出作用。...自动释放池的前世今生 ---- 深入解析 autoreleasepool[2] iOS autoreleasePool 原理总结[3] 黑幕背后的 Autorelease[4] autoreleasepool

51930
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    AutoreleasePool的那些事

    我们都知道一个iOS应用的如果是在main函数中,它的实现是 int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain...(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } 复制代码 我们看到在main中有个@autoreleasepool,那它到底是什么呢...了,而由tls代劳了,这样就节省了autoreleasepool对对象的存储,清除开销了。...那也就是说ARC下只要调用方和被调方都用ARC编译时,所建立的对象都不加入autoreleasepool.更简单的说我们自己写的类,调用工厂方法生成对象都不会放 入autoreleasepool....不过不知道是不是我理解的问题,我在代码中没有看到block中有autoreleasepool 在main写了如下代码 编译成汇编后,并没有看到 autoreleasepool的身影 然后在

    30420

    iOS - 聊聊 autorelease 和 @autoreleasepool

    原理分析 下面我们先通过macOS工程来分析@autoreleasepool的底层原理。 macOS工程中的main()函数什么都没做,只是放了一个@autoreleasepool。...系统干预释放是不指定@autoreleasepool,所有autorelease对象都由主线程的RunLoop创建的@autoreleasepool来管理。...有一种解释: 在iOS工程的main()函数中有一个@autoreleasepool,这个@autoreleasepool负责了应用程序所有autorelease对象的释放。...,所以RunLoop创建的@autoreleasepool是嵌套在main函数的@autoreleasepool内的。...AppKit 和 UIKit 框架会在RunLoop每次事件循环迭代中创建并处理@autoreleasepool,因此,你通常不必自己创建@autoreleasepool,甚至不需要知道创建@autoreleasepool

    2.4K52

    内存管理--34:自动释放池(autoreleasepool

    基本概念 autoreleasepool用于存放那些需要在稍后某个时刻释放的对象,清空自动释放池时,系统会向其中的对象发送release消息 花括号定义了自动释放池的范围,左花括号开始创建,右花括号处自动释放...,在此范围的末尾处,括号内的对象回收到release消息 @ autoreleasepool{ } autorelease方法会返回对象本身(MRC) Penson *p = [Person new]...的好处 不用关心对象释放时间 不用关心什么时候调用release //创建一个自动释放池 @autoreleasepool{ Person *p = [[Person alloc]init...{//创建第一个自动释放池 @autoreleasepool{//创建第二个自动释放池 @autoreleasepool{//创建第三个自动释放池 }//销毁第一个自动释放池...可以降低内存峰值(ARC) 把循环内的代码包裹在autoreleasepool中,那么在循环中自动释放对象就会放在这个池中,这样内存峰值就会降低(内存峰值:app在某个特定的时段内最大内存用量) for

    26810

    oc中__weak修饰的变量引用对象会不会放入autoreleasepool

    修饰符可以使修饰的变量引用不改变原对象的引用计数,而且在对象释放时可以对变量设为nil; 我一直认为引用的对象也会放入自动释放池,因为我看的书就是这样说的: 图片 所以当有人问题__weak修饰的变量引用对象会不会放入autoreleasepool...其实__weak修饰的变量引用对象是不会放入autoreleasepool的; 先看__autoreleasing修饰的所引用对象 @autoreleasepool { __autoreleasing...个字节存放自动释放池信息; 0x10480b038~ 0x10480b040 释放池的哨兵对象占用1个字节; 释放池里有两个对象; 所以__autoreleasing结果符合预期; __weak修饰的所引用对象 @autoreleasepool...~0x10480b038 这56个字节存放自动释放池信息; 0x10480b038~ 0x10480b040 释放池的哨兵对象占用1个字节; 释放池里仅有1个所谓的哨兵对象; 稍微修改下: @autoreleasepool

    1.1K30

    iOS_自动释放池AutoreleasePool、NSRunLoop、线程Thread 之间的关系

    众所周知:一个AutoreleasePool对应一个RunLoop,一个RunLoop对应一个线程。但一个RunLoop可以包含多个AutoreleasePool。...本篇大致聊一聊AutoreleasePool: 本质: AutoreleasePool的本质就是延迟 release 方法的调用。...调用方法的外围 加上内存管理代码 retain / release,所以其在作用域结束的时候就会被释放 以 其他 开头的初始化方法:系统会在 方法内部 自动加上 autorelease 方法,被注册到 AutoreleasePool...enumerateObjectsUsingBlock内部有autoReleasePool 参考: 黑幕背后的Autorelease(后面的黑魔法看不懂>_<) AutoreleasePool探索学习...(转化为.cpp文件) iOS探究 - autorelease 和 autoreleasepool(写得不错) 自动释放池的前世今生 ---- 深入解析 autoreleasepool (Page相关操作源码分析和结构示意图

    91120

    cocos2D-x 3.5 引擎解析之–引用计数(Ref),自己主动释放池(PoolManager),自己主动释放池管理器( AutoreleasePool

    /初始化引用计数为1 public: virtual ~Ref(); protected: unsigned int _referenceCount;//引用计数 friend class AutoreleasePool...void purgePoolManager() { destroyInstance(); }//析构PoolManager指针 static void destroyInstance(); AutoreleasePool...初始化vector能够包括十个自己主动释放池 ~PoolManager(); void push(AutoreleasePool *pool);//把pool从back增加到vector...{ public: AutoreleasePool();//构造函数,初始化自己主动释放池名字为空,vector容量为150 AutoreleasePool(const std::string &...name); //构造函数,初始化自己主动释放池名字为name,vector容量为150 ~AutoreleasePool();//析构函数 void addObject(Ref *object

    35510

    iOS中内存管理

    { Person *p =[[[Person alloc]init] autorelease]; } 不要在自动释放池中使用比较消耗内存的对象 @autoreleasepool{ Person...*p =[[[Person alloc]init] autorelease]; //一万行代码 } 尽量不要再自动释放池中使用循环,特别的循环次数多的 @autoreleasepool{ for...{//创建第一个自动释放池 @autoreleasepool{//创建第二个自动释放池 @autoreleasepool{//创建第三个自动释放池 }...//销毁第一个自动释放池 }//销毁第二个自动释放池 }//销毁第三个自动释放池 合理利用autoreleasepool可以降低内存峰值(ARC) 把循环内的代码包裹在autoreleasepool...中,那么在循环中自动释放对象就会放在这个池中,这样内存峰值就会降低(内存峰值:app在某个特定的时段内最大内存用量) for(int i= 0;i < 99999; i ++){ @autoreleasepool

    27810

    iOS - 老生常谈内存管理(二):从 MRC 说起

    关于 Autorelease Pool Blocks Autorelease Pool Blocks 使用@autoreleasepool标记,示例如下: @autoreleasepool {...与任何其他代码块一样,@autoreleasepool可以嵌套,但是你通常不会这样做。 @autoreleasepool { // . . ....AppKit 和 UIKit 框架会在RunLoop每次事件循环迭代中创建并处理@autoreleasepool,因此,你通常不必自己创建@autoreleasepool,甚至不需要知道创建@autoreleasepool...关于@autoreleasepool的底层原理,可以参阅《iOS - 聊聊 autorelease 和 @autoreleasepool》。...如果你的应用程序或线程长期存在并且可能会产生大量的autorelease对象,则应使用@autoreleasepool(如 AppKit 和 UIKit 就在主线程创建了@autoreleasepool

    1.6K21

    Objective-c内存管理学习总结

    非自己生成的对象,自己也能持有,通过retain方法; 3、 不再需要自己持有的对象时,将其释放,用release方法; 4、 非自己持有的对象,无法释放; 2 Autorelease方法 Autoreleasepool...在对象超出指定生存范围时能够自动并正确地释放——通过将对象注册到autoreleasepool中实现,在最近的pool结束时,自动调用release方法释放对象。...特别说明:在函数返回值时,调用autorelease方法后,返回值对象的释放机制——在每一次事件触发时(即一个运行循环runloop),系统会自动生成一个autoreleasepool,在事件响应结束时...答案是,对于每一个Runloop, 系统会隐式创建一个Autoreleasepool,这样所有的release pool会构成一个象CallStack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的

    26430

    iOS内存管理-深入解析自动释放池

    主要内容: AutoreleasePool简介 AutoreleasePool底层原理 Autorelease与NSThread、NSRunLoop的关系 AutoreleasePool在主线程上的释放时机...AutoreleasePool在子线程上的释放时机 AutoreleasePool需要手动添加的情况 一、Autorelease简介 iOS开发中的Autorelease机制是为了延时释放对象。...,实际上必定要访问注册到Autoreleasepool的对象,即会自动加入Autoreleasepool; id的指针或对象的指针(id*,NSError **),在没有显式地指定修饰符时候,会被默认附加上...__autoreleasing修饰符,加入Autoreleasepool 注意:如果编译器版本为LLVM.3.0以上,即使ARC无效@autoreleasepool块也能够使用;如下源码所示: //MRC...六、AutoreleasePool需要手动添加的情况 尽管ARC已经做了诸多优化,但是有些情况我们必须手动创建AutoreleasePool,而其中的延时对象将在当前释放池的作用域结束时释放。

    5.2K82
    领券