美文网首页
iOS 在循环中使用计算属性导致内存暴涨

iOS 在循环中使用计算属性导致内存暴涨

作者: 字节码 | 来源:发表于2017-03-28 00:03 被阅读353次

在OC的API中使用,readonly 和 copy声明,一般都是一个计算值,而在循环体中直接使用计算属性则会大量消耗内存,此时最好的解决办法是在获取某个计算属性使用autoreleasepool来降低内存峰值, 另外autorelease的值在循环中也会大量消耗内存,当然也可以使用autoreleasepool来降低内存峰值;

高内存 低内存

下面两个测试例子

低内存:

while (true) {
        NSString *a = [[NSString alloc] initWithFormat:@"test"];
    }

高内存:

    while (true) {
        NSString *a = [NSString stringWithFormat:@"test"];
    }

当然上面的高内存版,使用autoreleasepool可以降低内存

while (true) {
    @autoreleasepool {
      NSString *a = [NSString stringWithFormat:@"test"];
    }
}

对于每一个Runloop, 系统会隐式创建一个Autorelease pool, 这样所有的release pool会构成一个象CallStack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Object会被release。
一个UI事件、Timer call、 delegate call、 都会是一个新的Runloop。
实际上对于 [NSString stringWithFormat:] 这类构造函数返回的对象都是autorelease的。
autorelease pool来避免频繁申请/释放内存(就是pool的作用了)!

总结:
1.一定要注意Autorelease pool的生存周期,理解Runloop,避免在对象被释放后使用。
2.[NSString stringWithFormat:]这类函数返回的对象是不需要再自己release的,它已经被autorelease了, MRC下如果你想把它当一个全局对象使用,那必须自己再retain, 释放时再release。

高内存 低内存

相关文章

  • iOS 在循环中使用计算属性导致内存暴涨

    在OC的API中使用,readonly 和 copy声明,一般都是一个计算值,而在循环体中直接使用计算属性则会大量...

  • UIWebView相关网站

    加载webView 内存泄露 导致内存暴涨的几种解决方案 http://blog.csdn.net/ios_pop...

  • Vue基本语法和生命周期

    计算属性和监视 计算属性在computed属性对象中定义计算属性的方法在页面中使用{{方法名}}来显示计算的结果 ...

  • Vue的基本语法和生命周期

    一、计算属性 计算属性在computed属性对象中定义计算属性的方法在页面中使用{{方法名}}来显示计算的结果 监...

  • Vue的基本语法和生命周期

    一、计算属性 计算属性在computed属性对象中定义计算属性的方法在页面中使用{{方法名}}来显示计算的结果 监...

  • 计算属性和监视

    计算属性和监视1.4.1. 计算属性1)在 computed 属性对象中定义计算属性的方法 2)在页面中使用{{方...

  • Vue计算属性和监视

    计算属性在vm实例中使用computed属性定义属性的方法在页面中使用插值表达式来显示计算的结果 监视属性通过vm...

  • Vue的常用的打开姿势

    计算属性和监视 计算属性:1)在 computed 属性对象中定义计算属性的方法2)在页面中使用{{方法名}}来显...

  • Vue基础语法和生命周期

    计算属性和监视 1、计算属性: 在computed属性对象中定义计算属性的方法 在页面中使用{{方法名}}来显示计...

  • VUE计算属性和监视

    计算属性在computed属性对象中定义计算属性的方法在页面中使用{{方法名}}来显示计算的结果 监视属性:通过通...

网友评论

      本文标题:iOS 在循环中使用计算属性导致内存暴涨

      本文链接:https://www.haomeiwen.com/subject/zoudottx.html