なぜNSArray,NSString,NSDictionaryはcopyを使うのか

2035 ワード

文字列にcopy修飾を使用するのは、可変文字列タイプに割り当てられた後、可変文字列を変更し、同時に自身を変更することを防止するためです.コレクションタイプcopy修飾は、可変のコレクションタイプに割り当てられた後、可変のコレクションの内容を変更し、同時に自分の内容を変更することを防止するために使用されます.
Personクラスの定義:@interface Person:NSObject
@property (nonatomic,strong) NSString *name; @property (nonatomic,strong) NSArray *array; @property (nonatomic,strong) NSDictionary *dict;
@end
まずPersonクラスを定義し、strongに設定してmain関数に次のコードを追加します.
main関数:
NSMutableString *str = [[NSMutableStringalloc] initWithString:@"aa"]; Person *p1 = [[Personalloc] init]; p1.name = str; [str appendString:@"bb"]; NSLog(@"%@%@", str, p1.name); NSLog(@"%p%p", str, p1.name); 実行後の結果:
2015-09-15 17:19:08.930 DeepCopy[3837:1317274] aabb aabb 2015-09-15 17:19:08.931 DeepCopy[3837:1317274] 0x10020a690 0x10020a690
ここから,2つの文字列のアドレスは同じであり,そのうちの1つを操作すると別の値が変化することが分かる.次はPersonhのstrongをcopyに変更して、もう一度実行します.
@property (nonatomic, copy) NSString *name; @property (nonatomic, copy) NSArray *array; @property (nonatomic, copy) NSDictionary *dict; 実行結果:
2015-09-15 17:05:30.314 DeepCopy[3798:1234635] aabb aa 2015-09-15 17:05:30.315 DeepCopy[3798:1234635] 0x10030a690 0x616125
ここから、copyを用いる場合、p 1を与えることがわかる.nameが付与された場合、p 1.nameのアドレスはもう違います.そうすれば、それぞれの値を変更して、互いに影響しません.NSArrayもNSDictionaryも同じです.以下は他の2つのタイプのテストコードで、結果はNSStringと同じで、すべてretainの時に1つのアドレスを印刷して、copyは1部コピーしました.
  // NSArray  copy, strong

//NSMutableArray *arr1 = [[NSMutableArray alloc] initWithArray:@[@"aa", @"bb"]];//Person *p1 = [[Person alloc] init];//p1.array = arr1;//[arr1 addObject:@"cc"];//NSLog(@"%@%@", arr1, p1.array);//NSLog(@"%p%p", arr1, p1.array);
      // NSDictionary  copy, strong

//NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithDictionary:@{@"a": @"1"}];//Person *p1 = [[Person alloc] init];//p1.dict = dict;//dict[@"b"] = @"2";//NSLog(@"%@%@", dict, p1.dict);//NSLog(@"%p%p", dict, p1.dict);