1. 程式人生 > >定義屬性時NSArray,NSString,NSDictionary為何要用copy

定義屬性時NSArray,NSString,NSDictionary為何要用copy

新人一枚,第一次寫部落格,有寫錯的敵方請見諒,一定認真改正。進入正題:

剛開始學習property的時候沒有太認真學這一段,就那麼幾種型別,對應著寫就完事了,也沒想太多,最近腦袋欠抽了,突然考慮了一下這個問題,為什麼NSArray,NSString,NSDictionary要用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(@"\n%@\n%@", str, p1.name);

NSLog(@"\n%p\n%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


從這我們可以看出兩個字串的地址是一樣的,只要操作其中一個,另一個的值就會發生改變。下面我們將Person.h中的strong改成copy,再執行一下:

@property

 (nonatomiccopyNSString *name;

@property (nonatomiccopyNSArray *array;

@property (nonatomiccopyNSDictionary *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時,再給p1.name賦值的時候,p1.name的地址已經不一樣了,這樣就可以各自修改各自的值,互不影響。NSArray和NSDictionary也是一樣的。以下是其他兩個型別測試程式碼,結果跟NSString是一樣的,都是retain的時候打印出一個地址,copy則是複製了一份。

程式碼很簡單,雖然問題很白痴,但是也困擾了我一天呢。我不是理論帝,只能用這種方法來講解了。以下是其他型別測試程式碼

int main(int argc,constchar * argv[]) {

@autoreleasepool {

// NSString  copy, strong

NSMutableString *str = [[NSMutableStringalloc] initWithString:@"aa"];

Person *p1 = [[Personalloc] init];

        p1.name = str;

        [str appendString:@"bb"];

NSLog(@"\n%@\n%@", str, p1.name);

NSLog(@"\n%p\n%p", str, p1.name);

// NSArray  copy, strong

//        NSMutableArray *arr1 = [[NSMutableArray alloc] initWithArray:@[@"aa", @"bb"]];

//        Person *p1 = [[Person alloc] init];

//        p1.array = arr1;

//        [arr1 addObject:@"cc"];

//        NSLog(@"\n%@\n%@", arr1, p1.array);

//        NSLog(@"\n%p\n%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(@"\n%@\n%@", dict, p1.dict);

//        NSLog(@"\n%p\n%p", dict, p1.dict);

    }

return0;

}