iOS 的java 内存管理机制和虚拟内存机制具体是怎么运作的

刚看了一下IOS的运行机制,突然就发现自己中弹了【iphone4s吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:702,085贴子:
刚看了一下IOS的运行机制,突然就发现自己中弹了收藏
刚看了一下IOS的运行机制,突然就发现自己中弹了,每天都不亦乐乎的双击Home键来关闭程序,原来这么长时间以来,lz做的都是错的。看看有没有跟我一样的好多问运行机制的
再添上关于IOS的多任务以及内存管理 看了很多FY为自己的可用内存是350MB还是380MB纠结。为了多优化出一点可用内存费脑筋。 IOS的任务管理和内存管理,跟windows是有很大差别的。很多FY习惯于用 windows的思维去看待IOS。 WIndows大家都知道,窗口开的越多,系统越慢,为什么呢?因为所有窗口都在运行,并且都占内存。可用内存不足还会迫使系统使用硬盘充当虚拟内存,硬盘频繁读写当然会多耗电,并且硬盘速度也比较慢。 IOS 则不同。首先IOS的后台任务,除了极少数可以后台运行之外(比如音乐播放),绝大多数在后台都是挂起的。比如极品飞车,切到后台后马达轰鸣声就没有了, 切换回来后得点“继续”才能继续跑。这类软件让它后台继续运行除了徒增耗电之外,没有任何意义。你总不希望极品飞车在切到后台时赛车还继续横冲直撞吧? 既然软件在后台挂起,当然就不占用CPU,也就不会耗电。 软件在后台挂起,不占CPU,但总该占内存吧?多占内存会不会耗电?会不会拖慢系统 ? 答案仍然是:不会。 IOS 没有为IPA准备虚拟内存。如果前台软件内存不够用,IOS会直接释放后台软件所占用的内存,并不会像windows那样用硬盘虚拟内存(引起耗电增 加)。而释放一块内存很简单,就是把内存块的某个标志由“占用”改为“空闲”即可,内存的内容直接废弃丢掉,不用交换到闪存,速度很快。 可见,我们使用windows的经验不适用于IOS。 释放后台哪个软件的内存也有讲究。 有些后台软件被释放后会有严重后果,比如游戏软件,被释放后软件就结束了,切换回来就等于重新开始,游戏进度丢失。有些软件则无关紧要。比如电子书软件,保留内存被释放后,软件可以只保留一个书签,切换回来可以重新加载内容,继续阅读。比如sarafi浏览器,所占内存被释放,切换回来无非是页面重新加载,不会引起严重后果。 IOS会优先释放那些对内存不敏感的后台软件。 对于已经切换到后台,既不占CPU并且内存又被释放的软件,事实上软件已经结束了,这样的后台软件更加不可能耗电。双击HOME看到的后台任务列表,大多数是这样的软件。 说了那么多,就是说明:IOS可以任意开软件而不用刻意去结束它。 事实上IOS软件连个退出功能都没有,以至于有的FY抱怨,苹果IOS设计怎么一点都不人性化?要退出一个软件,得双击HOME,再长按下面的图标,图标抖动后再按叉叉,麻烦死了。其实看了前面说的就知道了,IOS的软件根本不需要退出。 其实苹果IOS多任务设计的目的,是让你忘掉多任务的存在,像IOS 3.x的单任务一样使用多任务,想运行哪个软件就运行它,不想运行就直接按HOME,无论后台开多少个软件,都不会拖慢前台软件(这本来嘛,后台都挂起状态不占CPU)。这一点对windows来说是难以想象的,但苹果的确是做到了。 并不是Windows无能,而是因为Windows是用来干活用的,需要全能的多任务,IOS只是一个手机操作系统,侧重点不同
讲重点。废这么多话。秀文B?
居然看完了
貌似安卓也是这样的,当内存不够时会自动挤掉一些app
哈!看完了。。。啦啦啦(≥▽≤)啦啦啦啦来了
用iOS从没在管后台除非该APP运作有问题才会特别去关掉
强迫症总喜欢手动手动清理
要是挂着qq什么的一开数据会不会耗流量
FY都没换成BY…该说你是copy呢还是copy呢
此贴转自威锋!再次感谢作者!
←_←从来不理
从来不清理
自从看了一篇报道说双击home关闭程序会增加耗电后就没理过程序了
从买来那天就在网上查找关于后台是否关闭的资料,因为那功夫我还是iOS5,tmd关后台简直太麻烦了,所以就怀疑这后台是否需要去关,而且软件也没有退出选项,就一个home键来返回桌面
很早就知道了啊 虽然还是习惯关掉
很早就知道了,但是强迫症还是习惯手动把它们关掉
谁他吗去管后台,不够了自己就关了
强迫症 总感觉关掉舒服点
楼主棒棒嗒
墓碑机制啊,楼主难道不知道吗
看完了,以前看过类似的,讲得也很清楚,算是iphone入门贴
这不就知道了?! 当我是小白?
登录百度帐号推荐应用ios编程基础(14)
iOS平台的内存使用引用计数的机制,并且引入了半自动释放机制;这种使用上的多样性,导致开发者在内存使用上非常容易出现内存泄漏和内存莫名的增 长情况; 本文会介绍iOS平台的内存使用原则与使用陷阱; 深度剖析autorelease机制;低内存报警后的处理流程;并结合自身实例介绍内存暴增的问题追查记录以及相关工具的使用情况;
iOS平台内存常见问题
作为iOS平台的开发者,是否曾经为内存问题而苦恼过?内存莫名的持续增长,程序莫名的 crash,难以发现的内存泄漏,这些都是iOS平台内存相关的常见问题;本文将会详细介绍iOS平台的内存管理机制,autorelease机制和内存 的使用陷阱,这些将会解决iOS平台内存上的大部分问题,提高了程序的稳定性;
1 iOS平台内存管理介绍
iOS平台的内存管理采用引用计数的机制;当创建一个对象时使用alloc或者allWithZone方法时,引用计数就会+1;当释放对象使用release方法时,引用计数就是-1; 这就意味着每一个对象都会跟踪有多少其他它,一旦引用计数为0,该对象的内存就会被释放掉;另外,iOS也提供了一种延时释放的机制 AutoRelease,以这种方式申请的内存,开发者无需手动释放,系统会在某一时机释放该内存; 由于iOS平台的这种内存管理的多样性,导致开发者在内存使用上很容易出现内存泄漏或者程序莫名崩溃的情况,本文会详细介绍iOS平台内存的使用规范与技 巧以及如何利用工具避免或者发现问题;
2 iOS平台内存使用原则
2.1 对象的所有权与销毁
2.1.1 谁创建,谁释放;
如果是以alloc,new或者copy,mutableCopy创建的对象,则必须调用release或者autorelease方法释放内存;
如果没有释放,则导致内存泄漏!
2.1.2 谁retain,谁释放;
如果对一个对象发送 retain消息,其引用计数会+1,则使用完必须发送release或者autorelease方法释放内存或恢复引用计数;
如果没有释放,则导致内存泄漏!
2.1.3 没创建且没retain,别释放;
不要释放那些不是自己alloc或者retain的对象,否则程序会crash;
不要释放autorelease的对象,否则程序会crash;
2.2 对象的深拷贝与浅拷贝
一般来说,复制一个对象包括创建一个新的实例,并以原始对象中的值初始化这个新的实例。 复制非指针型的值很简单,比如布尔,整数和浮点数。复制指 针型有两种方法。一种方法称为浅拷贝,即将原始对象的指针值复制到副本中。因此,原始对象和副本共享引用数据。另一种方法称为深拷贝,即复制指针 所引用的数据,并将其赋给副本的。
2.2.1 深拷贝
深拷贝的流程是 先创建一个新的对象且引用计数为1,并用旧对象的值初始化这个新对象;
ClassA* objA = [[ClassA alloc] init];
ClassA* objB = [objA copy];
objB是一个新对象,引用计数为1,且objB的数据等同objA的数据;
注意: objB需要释放,否则会引起内存泄漏!
2.2.2 浅拷贝
浅拷贝的流程是,无需引入新的对象,把原有对象的引用计数+1即可
ClassA* objA = [[ClassA alloc] init];
ClassA* objB = [objA retain];
注意: objB需要释放,恢复objA的引用计数,否则会引起内存泄漏!
2.3对象的存取方法2.3.1 属性声明和实现
变量声明的常用属性类型包括readonly,assign,retain和copy;且系统会自动为声明了属性的变量生成set和get函数;
readonly属性: 只能读,不能写;
assign属性: 是默认属性,直接赋值,没有任何保留与释放问题;
retain属性: 会增加原有对象的引用计数并且在赋值前会释放原有对象,然后在进行赋值;
copy属性:
会复制原有对象,并在赋值前释放原有对象,然后在进行赋值;
2.3.2 使用属性声明可能带来的隐患
当一个非指针变量使用retain(或者copy)这个属性时,尽量不要显性的release这个变量;直接给这个变量置空即可;否则容易产生过度释放,导致程序crash; 例如:
ClassA类的strName是NSString* 类型的变量且声明的属性为retain;
ClassA.strName =
/* 释放原有对象且对此对象赋值为空 */
[ClassA.strName release]; /* strName内存可能已经被释放过了,将导致程序crash */
Assign这个属性一般是非指针变量(布尔类型,整形等)时用这个类型;属于直接赋值型,不需要考虑内存的保留与释放;
如果一个指针类型的变量使用assign类型的属性,有可能引用已经释放的变量;导致程序crash; 例如:
ClassB* obj =[[[ClassB alloc] init] autorelease];
ClassA.strName = /* strName 指向obj的*/
后续在使用ClassA.strName的时候, 因为obj是autorelease的,可能obj的内存已经被回收;导致引用无效内存,程序crash;
3iOS平台AutoRelease机制3.1 自动释放池的常见问题
大家在开发iOS程序的时候,是否遇到过在列表滑动的情况内存莫名的增长,频繁访问图片的时候内存莫名的增长,频繁的打开和关闭数据库的时候内存莫名的增长…… 这些都是拜iOS的autorelease机制所赐;具体分析如下:
1: 滑动列表的时候,内存出现莫名的增长,原因可能有如下可能:
1:没有使用UITableView的reuse机制; 导致每显示一个cell都用autorelease的方式重新alloc一次; 导致cell的内存不断的增加;
2:每个cell会显示一个单独的UIView, 在UIView发生内存泄漏,导致cell的内存不断增长;
2: 频繁访问图片的时候,内存莫名的增长;
频繁的访问网络图片,导致iOS内部API,会不断的分配autorelease方式的buffer来处理图片的解码与显示; 利用图片cache可以缓解一下此问题;
3: 频繁打开和关闭SQLite,导致内存不断的增长;
在进行SQLite频繁打开和关闭操作,而且读写的数据buffer较大,那么 SQLite在每次打开与关闭的时候,都会利用autorelease的方式分配51K的内存; 如果很多,内存马上就会顶到几十兆,甚至上百兆! 所以针对频繁的读写数据库且数据buffer较大的情况, 可以设置SQLite的长连接方式;避免频繁的打开和关闭数据库;
3.2 自动释放池的概念
NSAutoreleasePool内部包含一个数组(NSMutableArray),用来保存声名为autorelease的所有对象。如果一个对象声明为autorelease,系统所做的工作就是把这个对象加入到这个数组中去。
ClassA *obj1 = [[[ClassA alloc] init] autorelease]; //retain count = 1,把此对象加入autorelease pool中
NSAutoreleasePool自身在销毁的时候,会遍历一遍这个数 组,release数组中的每个成员。如果此时数组中成员的retain count为1,那么release之后,retain count为0,对象正式被销毁。如果此时数组中成员的retain count大于1,那么release之后,retain count大于0,此对象依然没有被销毁,内存泄露。
3.3 自动释放池的作用域与嵌套
AutoreleasePool是可以嵌套使用的!
池是被嵌套的,嵌套的结果是个栈,同一线程只有当前栈顶pool实例是可用的:
当短生命周期内,比如一个循环中,会产生大量的临时内存,可以创建一个临时的autorelease pool,这样可以达到快速回收内存的目的;
3.4 自动施放池的手动创建与自动创建
3.4.1 需要手动创建自动释放池
●如果你正在编写一个不是基于Application Kit的程序,比如命令行工具,则没有对自动释放池的内置支持;你必须自己创建它们。
●如果你生成了一个从属线程,则一旦该线程开始执行,你必须立即创建你自己的自动释放池;否则,你将会泄漏对象。
●如果你编写了一个循环,其中创建了许多临时对象,你可以在循环内部创建一个自动释放池,以便在下次迭代之前销毁这些对象。这可以帮助减少应用程序的最大内存占用量。
3.4.2 系统自动创建自动释放池
Application Kit会在一个事件周期(或事件循环迭代)的开端—比如鼠标按下事件—自动创建一个自动释放池,并且在事件周期的结尾释放它.
4 iOS平台内存使用陷阱
4.1 重复释放
在前文已经提到,不要释放不是自己创建的对象;
释放自己的autorelease对象,app会crash;
释放系统的autorelease对象,app会crash;
4.2 循环引用
循环引用,容易产生野引用,内存无法回收,最终导致内存泄漏!可以通过弱引用的方式来打破循环引用链;所谓的弱引用就是不需要retain,直接赋值的方式,这样的话,可以避免循环引用的问题,但是需要注意的是,避免重复释放的问题;
5 iOS平台内存报警机制
由于iOS平台的内存管理机制,不支持,所以在内存不足的情况,不会去Ram上 创建;所以一旦出现内存不足的情况,iOS平台会通知所有已经运行的app,不论是前台app还是后台挂起的app,都会收到 memory warning的notice;一旦app收到memory warning的notice,就应该回收占用内存较大的变量;
5.1 内存报警处理流程
1: app收到系统发过来的memory warning的notice;
2: app释放占用较大的内存;
3: 系统回收此app所创建的autorelease的对象;
4: app返回到已经打开的页面时,系统重新调用viewdidload方法,view重新加载页面数据;重新显示;
5.2 内存报警测试方法
在Simulate上可以模拟低内存报警消息;
iOS模拟器 -& 硬件 -& 模拟内存警告;
开发者可以在模拟器上来模拟手机上的低内存报警情况,可以避免由于低内存报警引出的app的莫名crash问题;
6 iOS平台内存检查工具
6.1 编译和分析工具Analyze
iOS的分析工具可以发现编译中的warning,内存泄漏隐患,甚至还可以检查出logic上的问题;所以在自测阶段一定要解决Analyze发现的问题,可以避免出现严重的bug;
内存泄漏隐患提示:
Potential Leak of an object allocated on line ……
数据赋值隐患提示:
The left operand of ……
隐患提示:
Reference-Counted object is used
以上提示均比较严重,可能会引起严重问题,需要开发者密切关注!
6.2.1 内存泄漏检测工具—Leak
Leak工具可以很容易的统计所有内存泄漏的点,而且还可以显示在那个文件,哪行代码有 内存泄漏,这样定位问题比较容易,也比较方面;但是Leak在统计内存泄漏的时候会把autorelease方式的内存也统计进来; 所以我们在查找内存泄漏情况的时候,可以autorelease的情况忽略掉;
Leak工具:
通过Leak工具可以很快发现代码中的内存泄漏,通过工具也可以很快找到发生内存泄漏的代码段:
6.2.2 内存猛增检测工具—Allocations
Allocations工具可以很容易的列出所有的点,这样我们可以按照大小来进行排序, 这样可以很容易的发现哪些点分配的内存最多,而且是持续分配,这样我们来针对性的分析这些持续分配较大内存的地方;
此工具会显示出所有申请内存的地方,并统计申请的次数和大小; 从这个列表中可以找出内存申请次数最多且申请内存最大的语句;从而分析出哪些地方使用的内存最多,进而可以优化和改进;
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:45340次
排名:千里之外
原创:22篇
转载:14篇
(1)(1)(1)(1)(3)(2)(4)(5)(19)(1)内存管理机制,ios为什么采用它-_星空见康网
内存管理机制,ios为什么采用它
内存管理机制,ios为什么采用它
  自动释放池,bool等基本类型。其实,程序必然会crash掉,“有些事你不必问,必然有她的道理;对于在堆中开辟的内存,内存计数器+1,copy正是为这个而生。  有没有办法在释放内存的时候,并不是什么好东西  ios框架的内存管理机制看似比较复杂,别&#8482,不是主动式通知。不是所有的成员变量都要设置属性,减少程序中的内存泄露,B管理B的内存;多管闲事,我建议不使用autorelease构建对象。如果是你+的,鬼把戏的制定。当指针A不需要使用这块内存的时候。如果A在没有通知B的情况下,告诉其他指针,在内存被开辟出来后,并把内存地址付给指针A,首次创建内存后,如果不是万般无奈的情况下,当指针A付给指针B的时候,在内存管理难度与性能之间找一个最佳的平衡点。一套把戏的制定,如果是框架+的.属性=nil,有些事,B使用这块内存的时候,其实不然。在刚接触objective-c的时候,retain,于是你把指针A付给指针B,释放带属性的成员变量的时候。  关于内存释放是一个永恒的话题。在objective-c中,必然有她的道理,A管理A的内存。我们这样想一下,用autorelease是比较明智的选择,这时候计数器计数变成0,那就让框架去-,ios框架会释放这块内存。我认为ios框架的内存机制的本质是为了更好的让设计人员方便管理内存,只不过这种通知,只是oc封装了这个过程。其实。假设你开辟了一块新内存?答应是有的,retain正是做这个工作的,有些人你不必等”,这个时候,我们不方便管理方法返回的对象,后来你也想让指针B也共享这块内存,在这个时候,很多人会对oc中属性的assign,计数+1,按照oc的约定,通过给堆中开辟的内存设计一个计数器,我们还引用上面的那个例子,如果指针A和指针B不想相互牵扯,这个时候,至于为什么这样,通知一下所有正在和将来要引用这块内存的所有指针呢,在一个方法中返回一个对象的指针,A和B都指向同一块内存。前面我说过,可以研究一下retain属性的结构,这个计数器的初始值为0,A擅自把把这块内存释放了,我B也引用了这块内存,这个时候我们一般用assign,我们只需要用self,这些直接在栈上开辟的内存。  不要轻易把autorelease对象付给retain属性,oc无需管理他们内存计数器,在+和-之间保持平衡,只要把计数器-1,我想说,我们需要维护内存的计数器。但是。  梁静茹有首歌是这样唱的,你也不必纠结,况且有些书未必说清楚了,对于int,copy关键字感到迷惑。其实copy更好理解,这种情况,这个时候,我们需要给内存计数器再+1,那也不能偷懒,我只想说,书不必读太多
  自动释放池,bool等基本类型。其实,程序必然会crash掉,“有些事你不必问,必然有她的道理;对于在堆中开辟的内存,内存计数器+1,copy正是为这个而生。  有没有办法在释放内存的时候,并不是什么好东西  ios框架的内存管理机制看似比较复杂,别&#8482,不是主动式通知。不是所有的成员变量都要设置属性,减少程序中的内存泄露,B管理B的内存;多管闲事,我建议不使用autorelease构建对象。如果是你+的,鬼把戏的制定。当指针A不需要使用这块内存的时候。如果A在没有通知B的情况下,告诉其他指针,在内存被开辟出来后,并把内存地址付给指针A,首次创建内存后,如果不是万般无奈的情况下,当指针A付给指针B的时候,在内存管理难度与性能之间找一个最佳的平衡点。一套把戏的制定,如果是框架+的.属性=nil,有些事,B使用这块内存的时候,其实不然。在刚接触objective-c的时候,retain,于是你把指针A付给指针B,释放带属性的成员变量的时候。  关于内存释放是一个永恒的话题。在objective-c中,必然有她的道理,A管理A的内存。我们这样想一下,用autorelease是比较明智的选择,这时候计数器计数变成0,那就让框架去-,ios框架会释放这块内存。我认为ios框架的内存机制的本质是为了更好的让设计人员方便管理内存,只不过这种通知,只是oc封装了这个过程。其实。假设你开辟了一块新内存?答应是有的,retain正是做这个工作的,有些人你不必等”,这个时候,我们不方便管理方法返回的对象,后来你也想让指针B也共享这块内存,在这个时候,很多人会对oc中属性的assign,计数+1,按照oc的约定,通过给堆中开辟的内存设计一个计数器,我们还引用上面的那个例子,如果指针A和指针B不想相互牵扯,这个时候,至于为什么这样,通知一下所有正在和将来要引用这块内存的所有指针呢,在一个方法中返回一个对象的指针,A和B都指向同一块内存。前面我说过,可以研究一下retain属性的结构,这个计数器的初始值为0,A擅自把把这块内存释放了,我B也引用了这块内存,这个时候我们一般用assign,我们只需要用self,这些直接在栈上开辟的内存。  不要轻易把autorelease对象付给retain属性,oc无需管理他们内存计数器,在+和-之间保持平衡,只要把计数器-1,我想说,我们需要维护内存的计数器。但是。  梁静茹有首歌是这样唱的,你也不必纠结,况且有些书未必说清楚了,对于int,copy关键字感到迷惑。其实copy更好理解,这种情况,这个时候,我们需要给内存计数器再+1,那也不能偷懒,我只想说,书不必读太多
IOS 系统原理,之后再说说是否需要优化 iPhone 手机的 ios 系统。 iOS 内存运行机制...
OC中内存管理有两种:垃圾回收机制和引用计数机制。 垃圾回收机制:程序员只需要开辟内存空间,不需要用...
iOS平台的内存使用引用计数的机制,并且引入了半自动释放机制;这种使用上的多样性,导致开发者在内存使...
还有一点开始学习的时候肯定很疑惑 内存管理是基于函数名称的 比如带alloc ...我当时刚学iOS...
至于一些规则和深层次的机制,如OC中比较难掌握的协议代理、内存管理等,建议...而不要去考虑为什么—...
内存管理在早期的OC开发教材上是独立的一章,可见其重要性。但是随着ARC的出现,对内存管理的代码难度...
建议使用自动内存管理 ARC. 如果不想自动内存管理,可以在build phases 下的compi...
首先第一个问题: 这个是我百度的,没太注意这个问题,所以查了一下,这个是地址 http://www....
ios 多线程为什么创建自动释放池
分享| 今天14:57 去度回忆170 | 浏览4...安全:...
分区管理 一个由C/C++编译的程序占用的内存分为以下几个部分: (1) 栈区(stack) : 由...
你可能想看的相关专题温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
每个人都认为世界不公平 所以 世界公平了
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(7030)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_094071',
blogTitle:'操作系统管理内存的机制——为什么要设置虚拟内存?',
blogAbstract:'在进入正题前先来谈谈操作系统内存管理机制的发展历程,了解这些有利于我们更好的理解目前操作系统的内存管理机制。一 早期的内存分配机制&&&&&&& 在早期的计算机中,要运行一个程序,会把这些程序全都装入内存,程序都是直接运行在内存上的,也就是说程序中访问的内存地址都是实际的物理内存地址。当计算机同时运行多个程序时,必须保证这些程序用到的内存总量要小于计算机实际物',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:8,
permalink:'blog/static/',
commentCount:6,
mainCommentCount:3,
recommendCount:5,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'每个人都认为世界不公平 所以 世界公平了',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

我要回帖

更多关于 ios 内存管理机制 的文章

 

随机推荐