iOS 容器类的内存研究

2023-06-27  本文已影响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 不会增加引用计数,同时会生成新的数组,但数组内的元素并不会生成拷贝。

上一篇 下一篇

猜你喜欢

热点阅读