copy与mutableCopy的内存管理剖析

  • 时间:
  • 浏览:1
  • 来源:uu快3官方邀请码_uu快3app赚钱_彩神8

//输出内存中的地址

NSLog(@"str1: %p, reC:%ld", str1, [str1 retainCount]);

NSLog(@"str2: %p, reC:%ld", str2, [str2 retainCount]);

NSLog(@"str3: %p", str3);

NSLog(@"str4: %p", str4);

输出为:tutuge blog

汇总:

title: copy与mutableCopy的内存管理剖析

date: 2016-04-24 16:100:04

// 有bug,不需要 要做copyArray的release

我的理解:

NSString在系统进程池池中使用非常大,本来在immutable的copy和mutableCopy的原理下,为了系统性能的考虑,增加了只本来NSString居于,则直接把字符串地址付给使用者即可。将会此时str2=@"abdt"了,则直接拿生成的abdt的地址赋值给str2即可。

log:

2016-04-24 22:58:42.319 TestCopy[2164:2401008] str1: 0x7fa7ebca0c100, reC:1

2016-04-24 22:58:42.319 TestCopy[2164:2401008] str2: 0x7fa7ebca85100, reC:1

2016-04-24 22:58:42.319 TestCopy[2164:2401008] str3: 0xa000000006362613

2016-04-24 22:58:42.320 TestCopy[2164:2401008] str4: 0x7fa7ebca7ed0

则输出为: tutuge

//输出内存中的地址

NSLog(@"str1: %p", str1);

NSLog(@"str2: %p", str2);

NSLog(@"str3: %p", str3);

NSLog(@"str4: %p", str4);

NSLog(@"str5: %p", str5);

NSLog(@"str6: %p", str6);

与immutable的非集合一样,copy将直接增加指针指向对象的引用计数器(集合的话:各元素的指针计数器都增加了1)。本来在copyArray更改前,不需要 要做release,有些会有内存泄漏

总结:immutableObject做copy时,做的是浅copy,也本来说本来所指向的对象的内存计数器增加了1,本来将会urlRequest1重新赋值时,不需要 做下release把已经 所指的对象的内存计数器减1,有些就会有内存泄露。如下:

2016-04-24 22:41:100.629 TestCopy[2094:229125] str1: 0x1081af070

2016-04-24 22:41:100.6100 TestCopy[2094:229125] str2: 0x1081af070

2016-04-24 22:41:100.6100 TestCopy[2094:229125] str3: 0x1081af070

2016-04-24 22:41:100.6100 TestCopy[2094:229125] str4: 0x1081af070

2016-04-24 22:41:100.6100 TestCopy[2094:229125] str5: 0x1081af070

2016-04-24 22:41:100.631 TestCopy[2094:229125] str6: 0x7fb1d3f0ce70

最后看2段代码:

猜下结果:

copyArray = @[@"a",@"d"];

NSLog(@"array:%@,copyArr:%@,mCopyArray:%@", array, copyArray, mCopyArray);

// log: =====array:0x7fb2a8f0d2b0,arrayRec:2, =====copyArray:0x7fb2a8f1b9100,copyArrayRec:1, ======mCopyArry:0x7fb2a8e10ef0, mCopyArrayRec:1

将会更改为:@interface UserEntity : NSObject

@property(copy, nonatomic) NSString *name;

@end

我本来知道为那先 一说这名,本来人都拿NSString和NSMutableString做测试,我要我最直接的是将会常用又实现了copy和mutableCopy的代理,有些NSString类的我觉得 比较特殊,不应该拿NSString来测试,本来本文拿实现代理的NSURLRequest来做测试。

总结:mutableObject的群克隆是深群克隆,直接创建一个多 新的内存地址来群克隆其内容(在集合中把各个元素的内容都赋值了一遍)。 与已经 的被群克隆项无任何关系。

NSURLRequest *urlRequest1 = [urlRequest copy];

NSLog(@"urlRequest1:%@, urlRequest1:%ld", urlRequest1, [urlRequest1 retainCount]);

// log: urlRequest1: { URL: ceshi }, urlRequest1:2