iOS中copy和strong修饰符的区别数组
//用copys修饰的生成的都是不可变的对象 ,若是调用可变类型方法的直接报错 @property(nonatomic,copy)NSString * cpStr; @property(nonatomic,strong)NSString *strongStr;
1.当copy的对象类型为不可变对象如NSString类型时,和Strong修饰做用是同样的app
NSString *str = @"wxwx"; self.cpStr = str; self.strongStr = str ; str = @"haha"; NSLog(@"str==%p,\n cpstring==%p,\n storngstr==%p",str,_cpStr,_strongStr); NSLog(@"str==%@,\n cpstring==%@,\n storngstr==%@",str,_cpStr,_strongStr);
//打印信息:atom
str==0x105086190,spa
cpstring==0x105086170,code
storngstr==0x105086170orm
----------对象
str==haha,blog
cpstring==wxwx,内存
storngstr==wxwxstring
很明显二者指向的是同一块内存地址,因为指向不可变的对象不用担忧对象值改变引发原始值的变化
2.再来看二者指向可变对象的时候
NSMutableString *str = [NSMutableString stringWithFormat:@"caca"]; self.cpStr = str; self.strongStr = str ; [str insertString:@"ha21" atIndex:0]; NSLog(@"str==%p,\n cpstring==%p,\n storngstr==%p",str,_cpStr,_strongStr); NSLog(@"str==%@,\n cpstring==%@,\n storngstr==%@",str,_cpStr,_strongStr);
能够看到打印信息为:
str==0x600002569aa0,
cpstring==0xf3479ef8a5126e6a,//指向的地址已经改变
storngstr==0x600002569aa0
----------------------
str==ha21caca,
cpstring==caca,//copy对象的值仍是原始值。
storngstr==ha21caca
因为指向可变的对象,用copy修饰的话就算对象的值发生改变也不会影响自己
浅拷贝:指向可变对象的时候利用copy,新产生一分内存,但子对象仍是指向原先内存。
深拷贝:子对象也从新生成一分内存。
以下代码展现了浅拷贝:
NSMutableArray *arr1 =[ NSMutableArray arrayWithObjects:[NSMutableString stringWithString:@"tom"],[NSMutableString stringWithString:@"jack"], nil]; NSArray*arr2 = [arr1 copy]; [arr1[0] appendString:@" new value"]; NSLog(@"浅拷贝---arr1==%@,arr2===%@ \n 地址---arr1=%p,arr2=%p",arr1,arr2,arr1,arr2);
查看log:
浅拷贝---arr1==( "tom new value", jack ),arr2===( "tom new value", jack ) 地址---arr1=0x1020309e0,arr2=0x102030de0
很明显,arr1,arr2的内存是不一致的,但里面的子对象指向的内存仍是同一块.
深拷贝:实现深拷贝的方法,须要将子对象也都复制一份。好比经过遍历数组中的每一个对象并未没个对象建立新的拷贝.
下面经过归档实现深拷贝:
NSMutableArray *agearr = [NSMutableArray arrayWithObjects:[NSMutableString stringWithString:@"jack"],[NSMutableString stringWithString:@"tom"], nil]; NSData *data = [NSKeyedArchiver archivedDataWithRootObject:agearr]; NSMutableArray* agearr2 = [NSKeyedUnarchiver unarchiveObjectWithData:data]; NSMutableString *obj1 = agearr2[0]; [obj1 appendString:@"----some value"]; NSMutableArray *tarr = [agearr mutableCopy]; [[tarr objectAtIndex:0] appendString:@"==lepp"]; NSLog(@"age1===%@\n age2===%@ tarr==%@",agearr,agearr2,tarr);
查看Log:
age1===( "jack==lepp", tom ) age2===( "jack----some value", tom ) tarr==( "jack==lepp", tom )
当属性为不可变时用copy(防止属性值被篡改),指向可变属性时用strong(注:若是仍是用copy,因为copy返回的都是不可变的对象,一旦调用不可变对象的方法就会引发崩溃,因此这里也不能用copy)
对于其余可变非可变类同理(NSArray,NSMutableArray等)