NSArray *array = [[NSArray alloc] initWithObjects:@23, @"re", nil] ;
NSArray *arr2 = array;
NSLog(@"%lu",(unsigned long)[array retainCount]);
NSLog(@"%lu",(unsigned long)[arr2 retainCount]);
结果是 1,1
NSArray *array = [[NSArray alloc] initWithObjects:@23, @"re", nil] ;
NSArray *arr2 = [array copy];
NSLog(@"%lu",(unsigned long)[array retainCount]);
NSLog(@"%lu",(unsigned long)[arr2 retainCount]);
结果是 2,2
NSArray *array = [[NSArray alloc] initWithObjects:@23, @"re", nil] ;
NSArray *arr2 = [array mutbaleCopy];
NSLog(@"%lu",(unsigned long)[array retainCount]);
NSLog(@"%lu",(unsigned long)[arr2 retainCount]);
结果是1,1
PHPz2017-04-24 09:13:20
リーリー
上記のコードは深いコピーでも浅いコピーでもありません。それらは同じメモリを指しているだけです。
上記のコードでは、理論的には array
によって浅いコピーが作成されますが、実際にはコピーは発生せず、retain
が 1 回だけ行われます。 array
创建了一份浅拷贝,可实际上并没有发生任何拷贝,仅仅做了一次 retain
。
这是因为 NSArray
是一个不可被修改的只读数组,它在实现 NSCopying
protocol 的时候很机(tou)智(lan)的仅仅做了一次 retain
而没有创建任何新对象,所以造成 array
和 arr2
引用计数都变成 2,有些违反直觉。
注意,此时 array
和 arr2
是指向同一片内存的,通过打印指针地址可以明显的看出来。
NSArray *arr2 = array;
上面这段代码,mutableCopy
返回的是一个 NSMutableArray
,这时候 NSArray
没什么巧可取,就是老老实实的创建了一个新的 NSMutableArray
对象,array
指向 NSArray
,arr2
指向新创建的 NSMutableArray
,所以引用计数都是 1。
回到深拷贝和浅拷贝,对于一个容器来说,如果拷贝时容器里面的对象仅仅增加了引用计数,那么就是浅拷贝;否则,如果为每一个对象创建了新对象,那么就是深拷贝。
题主应该用 NSMutableArray
来尝试才能得到清晰正确的结果,NSArray
这种 immutable 的容器无法看出想要的效果。
顺便一提,NSMutableArray
的 copy
NSArray
は変更できない読み取り専用の配列であるため、NSCopying
プロトコルを実装するときに一度だけ実行するのが賢明です。 /code> は新しいオブジェクトを作成しないため、array
と arr2
の参照カウントは両方とも 2 になりますが、これはやや直感に反します。 🎜
🎜この時点では、array
と arr2
が同じメモリを指していることに注意してください。これは、ポインタ アドレスを出力すると明確にわかります。 🎜
🎜
リーリー
🎜上記のコードでは、mutableCopy
は NSMutableArray
を返します。現時点では、NSArray
には新しいものを作成するだけです。 code>NSMutableArray オブジェクト、array
は NSArray
を指し、arr2
は新しく作成された NSMutableArray
を指します。したがって、参照カウントはすべて 1 になります。 🎜
🎜
🎜ディープ コピーとシャロー コピーに戻ります。コンテナの場合、コピー時にコンテナ内のオブジェクトの参照カウントが増加するだけの場合、それはシャロー コピーです。それ以外の場合、オブジェクトごとに新しいオブジェクトが作成される場合、それはシャロー コピーです。深いコピー。 🎜
🎜質問者は、明確で正しい結果を得るために NSMutableArray
を使用してみる必要があります。 NSArray
のような不変コンテナでは、望ましい効果が得られません。 🎜
🎜 ちなみに、NSMutableArray
の copy
は浅いコピーです。 🎜PHP中文网2017-04-24 09:13:20
余談ですが、ブレークポイント、LLDB のデバッグ、またはメモリ アドレスの出力と観察は、ここでのメカニズムをより深く理解するのに役立ちます。