关于NSString,NSArray,NSDictionary等拥有mutable的类型,作为属性的时候,一定要使用copy修饰符号?通过代码来演示这么做的原因
@property (nonatomic, strong) NSString *p1;
@property (nonatomic, copy) NSString *p2;
//上面为声明的两个属性,分别使用strong与copy修饰
????NSMutableString *str = [NSMutableString stringWithFormat:@"ObjectiveC"];
? ? self.p1= str;
? ? self.p2= str;
? ? NSLog(@"str=%p,? %p",str, &str);
? ? NSLog(@"strong_Str=%p,? %p", _p1, &_p1);
? ? NSLog(@"copy_Str=%p,? %p", _p2, &_p2);
打印输出结果如下:
通过上述打印,对于源为可变类型那么会发现str与使用strong修饰的p1对象的地址完全是相同的;而使用copy修饰的p2对象的地址不同;可以得出copy是属于深拷贝,strong属于浅拷贝
接下来对str进行修改:
增加如下代码:
????[str appendString:@"hello"];
? ? NSLog(@"str? ? ==%@",str);
? ? NSLog(@"self.p1 ==%@",self.p1);
? ? NSLog(@"self.p2 ==%@",self.p2);
输出:
通过输出结果发现,使用strong修饰的属性p1输出结果被修改啦,而使用copy修饰的属性p2输出结果未被修改
再看如下代码:
?????NSString *str = @"Objective-C";
? ? self.p1= str;
? ? self.p2= str;
? ? NSLog(@"str=%p,? ? ? ? ? %p",str, &str);
? ? NSLog(@"strong_Str=%p,? %p", _p1, &_p1);
? ? NSLog(@"copy_Str=%p,? ? %p", _p2, &_p2);
? ? str =@"hello";
? ? NSLog(@"str? ? ==%@",str);
? ? NSLog(@"self.p1 ==%@",self.p1);
? ? NSLog(@"self.p2 ==%@",self.p2);
输出如下:
对于源为不可变NSString,无论是copy还是strong修饰全部为浅拷贝;
综上所述:为了防止NSString属性在使用过程中被Mutable子类修改,出于安全方面的考虑对于拥有mutable子类的属性,最好使用copy修饰;