copy与mutableCopy的内存管理剖析

  • 时间:
  • 浏览:0

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

我的理解:

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

不知道为哪几种一说你什儿 ,不要 不要 不要 不要 人都拿NSString和NSMutableString做测试,让我 最直接的是并且常用又实现了copy和mutableCopy的代理,并且 NSString类的觉得比较特殊,不应该拿NSString来测试,不要 不要 不要 不要 本文拿实现代理的NSURLRequest来做测试。

总结:immutableObject做copy时,做的是浅copy,也假若说假若所指向的对象的内存计数器增加了1,不要 不要 不要 不要 并且urlRequest1重新赋值时,都要做下release把并且所指的对象的内存计数器减1,并且 就会有内存泄露。如下:

汇总:

并且更改为:@interface UserEntity : NSObject

@property(copy, nonatomic) NSString *name;

@end

//输出内存中的地址

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

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

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

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

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

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

log:

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

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

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

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

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

输出为:tutuge blog

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

date: 2016-04-24 16:50:04

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

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

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

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

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

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

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

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

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

最后看2段代码:

//输出内存中的地址

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

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

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

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

NSURLRequest *urlRequest1 = [urlRequest copy];

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

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

则输出为: tutuge

猜下结果:

// 有bug,都要要做copyArray的release