zoukankan      html  css  js  c++  java
  • stringWithFormat 和 initWithFormat 有何不同?

     stringWithFormat 和 initWithFormat 有何不同?
    
    + stringWithFormat:
    – initWithFormat:
    一个类方法,一个实例方法    都是格式化字符串
    
    1、 initWithFormat是实例方法
    只能通过 NSString* str = [[NSString alloc] initWithFormat:@”%@”,@”Hello World”] 调用,但是必须手动release来释放内存资源(非ARC环境)
    
    2、 stringWithFormat是类方法
    可以直接用 NSString* str = [NSString stringWithFormat:@"%@",@"Hello World"] 调用,内存管理上是autorelease的,不用手动显式release
    
    一个常见错误:(非ARC环境)
    label.text = [[NSString alloc] initWithFormat:@”%@”,@”abc”];
    最后在dealloc中将label给release掉
    但是仍然会发生内存泄漏!
    原因在于:用label.text = …时,实际是隐式调用的label的setText方法,这会retain label内部的字符串变量text(哪怕这个字符串的内容 跟传进来的字符串内容相同 ,但系统仍然当成二个不同 的字符串对象),所以最后release label时,实际上只释放了label内部的text字符串,但是最初用initWithFormat生成的字符串并未释放,最终造成了泄漏。
    解决办法有二个:
    1、
    NSString * str = [[NSString alloc] initWithFormat:@”%@”,@”abc”];
    label.text = str;
    [str release]
    最后在dealloc中再[label release]
    2、
    label.text = [NSString stringWithFormat:@"%@",@"abc"];
    然后剩下的事情交给NSAutoreleasePool
    
    例如:
            非ARC环境下,循环构造10w个NSString,内容一样:
    
    首先是stringWithFormat,占用内存 5.2M
        for (int i = 0; i < 100000; i++) {
            [NSString stringWithFormat:@"%d",1234567890];
        }
    然后加上@autoreleasepool,占用内存 520KB
        for (int i = 0; i < 100000; i++) {
            @autoreleasepool {
                [NSString stringWithFormat:@"%d",1234567890];
            }
        }
    
    再来试试initWithFormat,占用内存 3.6MB
        for (int i = 0; i < 100000; i++) {
            [[NSString alloc] initWithFormat:@"%d",1234567890];
        }
    再加上autorelease尾巴和autoreleasepool,占用内存 520KB
        for (int i = 0; i < 100000; i++) {
            @autoreleasepool {
                [[[NSString alloc] initWithFormat:@"%d",1234567890] autorelease];
            }
        }
    
    + stringWithFormat:
    类方法,返回一个autorelease的NSString实例,不用手动Release,在自动释放池中会自动释放。
    
    – initWithFormat:
    实例方法,返回一个自己Alloc申请内存的NSString实例,根据OC内存管理黄金法则,管杀管埋,它则需要自己手动Release。
    
    两个方法只是在没有使用ARC的时候有所不同,一个需要手动Release一个则是自动进入autoreleasepool,所以在使用ARC的时候他们俩几乎没有什么区别。
  • 相关阅读:
    拓端数据|R语言乘法GARCH模型对高频交易数据进行波动性预测
    拓端数据|Python中用Prophet模型对天气时间序列进行预测与异常检测
    拓端数据|R语言:状态空间模型和卡尔曼滤波预测酒精死亡人数时间序列
    拓端数据|R语言用LOESS(局部加权回归)季节趋势分解(STL)进行时间序列异常检测
    拓端数据|数据挖掘:香水电商销售策略分析
    UOJ#523. 【美团杯2020】半前缀计数 后缀自动机
    LuoguP6688 可重集 线段树+hash
    LuoguP6687 论如何玩转 Excel 表格 树状数组
    LOJ#2303. 「NOI2017」蚯蚓排队 hash+链表
    LOJ#6289. 花朵 树链剖分+分治NTT
  • 原文地址:https://www.cnblogs.com/pocket-mood/p/4331270.html
Copyright © 2011-2022 走看看