美文网首页
iOS 容器类的内存研究

iOS 容器类的内存研究

作者: 万年老参 | 来源:发表于2023-06-27 17:46 被阅读0次

先上代码:

 NSMutableArray *muary = [[NSMutableArray alloc]init];
    NSMutableString *string3 = [[NSMutableString alloc]initWithString: @"muTableString"];
    [muary addObjectsFromArray:@[@"1",@"2",@"3",@"4",@"5",@"123456789",@"12345678901",@"4",string3]];
    NSArray *ary1; //直接赋值
    NSArray *ary2; //mutableCopy
    NSMutableArray *muary1;
    NSMutableArray *muary2;
    NSLog(@"地址:%p,%p,%p,%p,%p,%p",string3,muary,ary1,ary2,muary1,muary2);
    int muaryNumber = CFGetRetainCount((__bridge CFTypeRef)(muary));
    NSLog(@"初始计数%d",muaryNumber);
    ary1 = muary;
    muaryNumber = CFGetRetainCount((__bridge CFTypeRef)(muary));
    NSLog(@"直接赋值给不可变数组ary1后的计数%d",muaryNumber);
    ary2 = [muary mutableCopy];
    muaryNumber = CFGetRetainCount((__bridge CFTypeRef)(muary));
    NSLog(@"mutableCopy赋值给不可变数组ary2后的计数%d",muaryNumber);
    muary1 = muary;
    muaryNumber = CFGetRetainCount((__bridge CFTypeRef)(muary));
    NSLog(@"直接赋值给可变数组muary1后的计数%d",muaryNumber);
    muary2 = [muary mutableCopy];
    muaryNumber = CFGetRetainCount((__bridge CFTypeRef)(muary));
    NSLog(@"mutableCopy赋值给可变数组muary2后的计数%d",muaryNumber);
    NSLog(@"地址:%p,%p,%p,%p,%p,%p,",string3,muary,ary1,ary2,muary1,muary2);

    [string3 appendString:@"添加长度"];
    NSLog(@"更改string3后\n%@\n%@\n%@\n%@\n%@",muary,ary1,ary2,muary1,muary2);
    [muary addObject:@"123"];
    NSLog(@"添加元素后\n%@\n%@\n%@\n%@\n%@",muary,ary1,ary2,muary1,muary2);
    
    [muary removeObjectAtIndex:3];
    NSLog(@"删除重复元素后\n%@\n%@\n%@\n%@\n%@",muary,ary1,ary2,muary1,muary2);
    
    [muary replaceObjectAtIndex:1 withObject:@"YES"];
    NSLog(@"替换o某一元素后\n%@\n%@\n%@\n%\n%@",muary,ary1,ary2,muary1,muary2);

运行结果:

2020-04-07 12:29:07.623209+0800 WKWebViewDemo[17220:6371539] 地址:0x28326b090,0x28326afd0,0x0,0x0,0x0,0x0
2020-04-07 12:29:07.623540+0800 WKWebViewDemo[17220:6371539] 初始计数1
2020-04-07 12:29:07.623617+0800 WKWebViewDemo[17220:6371539] 直接赋值给不可变数组ary1后的计数2
2020-04-07 12:29:07.623706+0800 WKWebViewDemo[17220:6371539] mutableCopy赋值给不可变数组ary2后的计数2
2020-04-07 12:29:07.623774+0800 WKWebViewDemo[17220:6371539] 直接赋值给可变数组muary1后的计数3
2020-04-07 12:29:07.623843+0800 WKWebViewDemo[17220:6371539] mutableCopy赋值给可变数组muary2后的计数3
2020-04-07 12:29:07.623948+0800 WKWebViewDemo[17220:6371539] 地址:0x28326b090,0x28326afd0,0x28326afd0,0x2832b0240,0x28326afd0,0x2832b0300,
2020-04-07 12:29:14.154687+0800 WKWebViewDemo[17220:6371539] 更改string3后
(
    1,
    2,
    3,
    4,
    5,
    123456789,
    12345678901,
    4,
    "muTableString\U6dfb\U52a0\U957f\U5ea6"
)
(
    1,
    2,
    3,
    4,
    5,
    123456789,
    12345678901,
    4,
    "muTableString\U6dfb\U52a0\U957f\U5ea6"
)
(
    1,
    2,
    3,
    4,
    5,
    123456789,
    12345678901,
    4,
    "muTableString\U6dfb\U52a0\U957f\U5ea6"
)
(
    1,
    2,
    3,
    4,

    5,
    123456789,
    12345678901,
    4,
    "muTableString\U6dfb\U52a0\U957f\U5ea6"
)
(
    1,
    2,
    3,
    4,
    5,
    123456789,
    12345678901,
    4,
    "muTableString\U6dfb\U52a0\U957f\U5ea6"
)
2020-04-07 12:29:59.970575+0800 WKWebViewDemo[17220:6371539] 添加元素后
(
    1,
    2,
    3,
    4,
    5,
    123456789,
    12345678901,
    4,
    "muTableString\U6dfb\U52a0\U957f\U5ea6",
    123
)
(
    1,
    2,
    3,
    4,
    5,
    123456789,
    12345678901,
    4,
    "muTableString\U6dfb\U52a0\U957f\U5ea6",
    123
)
(
    1,
    2,
    3,
    4,
    5,
    123456789,
    12345678901,
    4,
    "muTableString\U6dfb\U52a0\U957f\U5ea6"
)
(
    1,
    2,
    3,
    4,
    5,
    123456789,
    12345678901,
    4,
    "muTableString\U6dfb\U52a0\U957f\U5ea6",
    123
)
(
    1,
    2,
    3,
    4,
    5,
    123456789,
    12345678901,
    4,
    "muTableString\U6dfb\U52a0\U957f\U5ea6"
)
2020-04-07 12:29:59.971163+0800 WKWebViewDemo[17220:6371539] 删除重复元素后
(
    1,
    2,
    3,
    5,
    123456789,
    12345678901,
    4,
    "muTableString\U6dfb\U52a0\U957f\U5ea6",
    123
)
(
    1,
    2,
    3,
    5,
    123456789,
    12345678901,
    4,
    "muTableString\U6dfb\U52a0\U957f\U5ea6",
    123
)
(
    1,
    2,
    3,
    4,
    5,
    123456789,
    12345678901,
    4,
    "muTableString\U6dfb\U52a0\U957f\U5ea6"
)
(
    1,
    2,
    3,
    5,
    123456789,
    12345678901,
    4,
    "muTableString\U6dfb\U52a0\U957f\U5ea6",
    123
)
(
    1,
    2,
    3,
    4,
    5,
    123456789,
    12345678901,
    4,
    "muTableString\U6dfb\U52a0\U957f\U5ea6"
)
2020-04-07 12:30:02.396001+0800 WKWebViewDemo[17220:6371539] 替换o某一元素后
(
    1,
    YES,
    3,
    5,
    123456789,
    12345678901,
    4,
    "muTableString\U6dfb\U52a0\U957f\U5ea6",
    123
)
(
    1,
    YES,
    3,
    5,
    123456789,
    12345678901,
    4,
    "muTableString\U6dfb\U52a0\U957f\U5ea6",
    123
)
(
    1,
    2,
    3,
    4,
    5,
    123456789,
    12345678901,
    4,
    "muTableString\U6dfb\U52a0\U957f\U5ea6"
)

(
    1,
    YES,
    3,
    5,
    123456789,
    12345678901,
    4,
    "muTableString\U6dfb\U52a0\U957f\U5ea6",
    123
)
(lldb) 
屏幕快照 2020-04-07 下午12.42.30.png

结论:
mutableCopy 不会增加引用计数,同时会生成新的数组,但数组内的元素并不会生成拷贝。

相关文章

  • QT容器类

    QT容器类,相对于C++的STL容器类,更为小巧、安全和方便使用。QT5在容器类里面做了优化速度、内存、inlin...

  • IOS didReceiveMemoryWarning 的那些事

    iOS的UIViewController 类给我们提供了处理内存不足的接口。 在iOS 3.0 之前,当系统的内存...

  • iOS内存研究

    swift的MemoryLayout MemoryLayout的3个属性:size:一个 T 数据类型...

  • 类的创建与销毁(二)

    销毁实例时注意事项 内存泄露 出现内存泄露的3种常见情况及应对原则 类中存在自我管理内存现象 类中存在容器(如数组...

  • iOS 内存泄漏检测

    【YFMemoryLeakDetector】人人都能理解的 iOS 内存泄露检测工具类 背景 即使到今天,iOS ...

  • iOS容器类介绍

    开发中最常用的是NSArray和NSDictionary,这就不介绍了 弱引用容器在添加对象的性能方面都弱于对应的...

  • Java面试核心框架

    常量池 常用关键字 final static 内部类 抽象类 接口 异常 注解 容器 内存管理内存模型、工作内...

  • Collections.sort

    Collections.sort(List)方法:如果容器内存储的是自定义的类的话,需要先让类实现Comparab...

  • iOS 数据结构之数组

    数组是线性结构是容器类型,是一块连续的内存空间, iOS 中用 NSArray 和 NSMutableArray ...

  • iOS 类方法和成员方法

    iOS 类方法和成员方法 类方法 静态方法,在类编译时在内存中创建,常驻内存,适用于,不需要访问该类成员变量的时候...

网友评论

      本文标题:iOS 容器类的内存研究

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