浅拷贝和深拷贝
在ios开发中我们会遇到深拷贝和浅拷贝的问题,下面的代码会实现深拷贝和浅拷贝
声明一个NSString属性使用copy要优于使用strong。这同样适用于遵守NSCoding协议的不可变类(immutable class),如NSNumber、NSArray、NSSet等。上面提到的这些类都有一个可变(mutable)的版本。选择使用copy的理由是,NSString属性可能被传入一个NSString实例,也可能是一个NSMutableString实例。当传入了一个NSMutableString实例时,字符串的值可能会在背后悄悄变化,copy在这里的目的就是为了防止后面的值发生改变而影响前面的值也随着发生改变,用了copy就是当属性传入一个NSMutableString实例时为深拷贝,避免值也发生改变。来瞧瞧这个例子:
在主函数部分:
#import <Foundation/Foundation.h>
#import "STUDENT.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSMutableString*str=[NSMutableString stringWithFormat:@"花花"];
STUDENT*s=[[STUDENT alloc]init];
s.name=str;
STUDENT*s1=[[STUDENT alloc]init];
s1=[s copy];
[str setString:@"草草"];
s1.name=str;
NSLog(@",....%@ %@",s.name,s1.name);
}
return 0;
}
在STUDENT.h 里
#import <Foundation/Foundation.h>
@interface STUDENT : NSObject<NSCopying,NSMutableCopying>
@property(nonatomic,copy)NSString*name;
@end
在STUDENT.m里
#import "STUDENT.h"
@implementation STUDENT
-(NSString*)description
{
return _name ;
}
-(id)copyWithZone:(NSZone *)zone
{
STUDENT*p=[STUDENT allocWithZone:zone];
p.name=[self.name copy];
return p;
}
1若前面声明属性的地方用了@property(nonatomic,copy)NSString*name;
那这个时候输出结果为
2若前面声明属性的地方用了@property(nonatomic,strong)NSString*name;
输出结果为: