内存管理4-Autoreleasepool
自动释放池是OC里面的一种内存回收机制,一般可以将一些临时变量添加到自动释放池中,统一回收释放,当自动释放池销毁时,池里面的所有对象都会调用一次release,也就是计数器会减1,但是自动释放池被销毁了,里面的对象并不一定会被销毁。
OC对象发送一条autorelease消息,就会把这个对象添加到最近的自动释放池中也就是栈顶释放池中, Autorelease实际上是把对release的调用延迟了,对于每一次autorelease,系统只是把对象放入了当前的autorelease poo(栈顶释放池中)l中,当pool被释放时,pool中所有的对象都会被调用release。
----------------------------------------------------
Autorelease will not change the Object counter,just throw them into a pool.
When destroy the pool?
}
-------------------------------------------
Way of writing
1
main()
{
@autorelease{
Student *stu=[[Student alloc]init];
[stu autorelease];
Student *stu1=[[Student alloc]init];
[Stu1=autorelease];
}
return 0;
}
2 //Most common used
Student *stu=[[[Student alloc]init]autorelease];
Student *stu1=[[[Student alloc]init]autorelease];
-------------------------------------------
//Create Autoreleasepool
1. iOS 5.0 after
@ autoreleasepool{
//code here
}
2.iOS 5.0 before
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];
//code here
[pool release];
// Or [pool drain]; Only have difference in Mac development between release and //drain.
-------------------------------------------------
//Another clever use of autorelease
//Create a static method to speedly create an object
//Student.h ( Method name is the same as class name by default)
//+(id)student;
//+(Student)student;
//Student.m
+(id)student{
Student *stu=[[[Student alloc]init]autorelease];
return stu;
}
main(){
autoreleasepool{
Student *stu=[Student student]
}
}
//latent rules
//iOS Static method/Object actually don't need developers to manage memory.
//They do autorelease inside themselves.
//So if you create a static method yourself ,you'd better guarantee it can autorelease.
-----------------------------------
//Create attribute for a class
//Student.h
@interface Student:NSObject
@property (nonatomic,assign) int age;
+(id)studentWithAge:(int)age;
@end
//Student.m
+(id)studentWithAge:(int)age{
Student *stu=[[[Student alloc]init]autorelease];
//Student *stu=[Student student];
//Student *stu=[self student]; //如何判别self指向谁?看谁调用studentWithAge
//静态方法,类名调用,当前调用这个方法的某个东西(对象,类)
//动态对象,(对象)
stu.age=age;
return stu;
}
---------------------------------------
questions
1 Final student method
+(id)student{
return [[[Student alloc]init]autorelease];
}
2
1.在ARC下,不能使用 [[ NSAutoreleasePool alloc ] init ](在5.0以前可以使用),而应该使用@autoreleasepool.(垃圾回收机制是完全不用我们释放内存,由开发工具来管理内存)
2.不要把大量循环放在autoreleasepool中,这样会造成内存峰值上升,因为里面创建的对象要等释放池销毁了才能释放,这种情况应该手动管理内存。(崩了好不)
3.尽量避免大内存使用该方法,对于这种延迟释放机制,尽量少用。(撑了好不)
4.SDK中利用静态方法创建并返回的对象都已经autorelease,不需要我们自己手动release。
但是通过[[NSNumber alloc]initWithInt:10]创建的对象需要release。
内存管理4-Autoreleasepool的更多相关文章
- 内存管理总结-autoreleasePool
转自其他 序言 无论是在MRC时期还是ARC时期,做过开发的程序员都接触过autoreleasepool.尽管接触过但本人对它还不是很了解.本文只是将自己的理解说出来.在内存管理的文章中提到了OC的内 ...
- 菜鸟学习Cocos2d-x 3.x——内存管理
菜鸟学习Cocos2d-x 3.x——内存管理 2014-12-10 分类:Cocos2d-x / 游戏开发 阅读(394) 评论(6) 亘古不变的东西 到现在,内存已经非常便宜,但是也不是可以 ...
- cocos2d-x内存管理
Cocos2d-x内存管理 老师让我给班上同学讲讲cocos2d-x的内存管理,时间也不多,于是看了看源码,写了个提纲和大概思想 一. 为什么需要内存管理 1. new和delete 2. 堆上申 ...
- iOS开发系列—Objective-C之内存管理
概述 我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上).如果一个对象创建并使用后没 ...
- ARC内存管理机制详解
ARC在OC里面个人感觉又是一个高大上的牛词,在前面Objective-C中的内存管理部分提到了ARC内存管理机制,ARC是Automatic Reference Counting---自动引用计数. ...
- objective-c 语法快速过(6)内存管理原理
内存管理基本原理(最重要) 移动设备的内存极其有限(iphone 4内存512M),每个app所能占用的内存是有限制的(几十兆而已). 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不 ...
- 06OC之内存管理
在高级语言中,例如C#是通过垃圾回收机制(GC)来解决这个问题,但是在OC并没有类似的垃圾回收机制,因此必须由程序员手动去维护.今天就讲讲OC中的内存管理: 一.内存管理原理 在Xcode4.2之后的 ...
- iOS经典面试题总结--内存管理
iOS经典面试题总结--内存管理 内存管理 1.什么是ARC? ARC是automatic reference counting自动引用计数,在程序编译时自动加入retain/release.在对象被 ...
- 【Cocos2d-x 3.x】内存管理机制与源码分析
侯捷先生说过这么一句话 : 源码之前,了无秘密. 要了解Cocos2d-x的内存管理机制,就得阅读源码. 接触Cocos2d-x时, Cocos2d-x的最新版本已经到了3.2的时代,在学习Coco ...
- iOS开发ARC内存管理技术要点
本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automatic Reference Counting,自动引用计数)内存管理技术的要点,所以不会涉及全部细节.这篇 ...
随机推荐
- git this exceeds GitHub's file size limit of 100.00 MB
git push origin master过程中,出现如下错误 关键词:this exceeds GitHub's file size limit of 100.00 MB 推的时候忽略文件的操作: ...
- codefroce 854 A.Fraction
题解:贪心,每次从能够出发的飞机中取一个最大的就好啦,用一个队列维护一下~ ac代码: #include <cstdio> #include <iostream> #inclu ...
- springboot + quartz
在这里我单独整理对定时任务的使用.之前觉得用@Scheduled这个注解就可以解决,后来发现,定时任务比较多时,且时间集中在某个时间段,或者执行的时间间隔比较短时,多个任务执行就会依次执行,这就导致任 ...
- Ubuntu 14.04 用户如何安装深度音乐播放器和百度音乐插件
播放本地音乐或者收听国外的音乐电台,Ubuntu 14.04 自带的音乐播放器 Rhythmbox 完全能够满足,但是如果你想有像酷狗那样的国内播放器就需要折腾一下,还好有深度音乐播放器,这是一款完全 ...
- 记录下js几种常见的数组排序和去重的方法
冒泡排序 , , , , , , , ]; function test(){ ; i < arr.length - ; i++){ ; j < arr.length; j++){ var ...
- redis集群安装2
概要:本文主要介绍如何在Centos7中单机搭建redis集群三主三从,按照本文绝对可以实现该需求,至于先搭建单机版主要为了方便理解redis集群,为下一步开发或生产上redis集群做铺垫.同时本 ...
- Image Processing and Analysis_15_Image Registration:Multi-modal volume registration by maximization of mutual information——1996
此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...
- vuejs开发流程
https://www.cnblogs.com/yexiaowang/p/8489250.html
- SQL性能优化思路
1. 尽可能把数据的存储和计算放入Memory而不是Disk,且减少IO操作,比如运用Redis等缓存技术 2. 对数据表进行精心设计,特别是大数据表,对常用数据字段进行适当的冗余,尽可能避免分表导致 ...
- 使用fastjson统一序列化响应格式
摘要:其实很简单的处理方式,只不够优雅,或者说没有找到fastjson为其提供便捷的处理方式.因此记录下处理该问题的过程. 目标:将所有api请求,即响应为APPLICATION_JSON的内容做统一 ...