OC語言中,最基礎(chǔ)的對象修飾福扬,copy與strong的區(qū)別:
@property (nonatomic, strong) NSString *strStrong;
@property (nonatomic, copy) NSString *strCopy;
對于不可變字對象:
NSString *testStr = @"test";
self.strStrong = testStr;
self.strCopy = testStr;
NSLog(@"test:%@===%p",testStr,testStr);
NSLog(@"strStrong:%@===%p",self.strStrong,self.strStrong);
NSLog(@"strCopy:%@===%p",self.strCopy,self.strCopy);
testStr = @"testChange";
NSLog(@"test:%@===%p",testStr,testStr);
NSLog(@"strStrong:%@===%p",self.strStrong,self.strStrong);
NSLog(@"strCopy:%@===%p",self.strCopy,self.strCopy);
打印結(jié)果:
test:test===0x109dd7080
strStrong:test===0x109dd7080
strCopy:test===0x109dd7080
test:testChange===0x109dd7100
strStrong:test===0x109dd7080
strCopy:test===0x109dd7080
從結(jié)果可以看出:
strong修飾的字符串毅贮,值未發(fā)生變化,內(nèi)存地址與原字符串相同
copy修飾的字符串驾凶,值未發(fā)生改變牙甫,內(nèi)存地址與原字符串相同,內(nèi)存地址拷貝
為淺拷貝调违。
對于可變對象:
NSMutableString *mutabStr = [[NSMutableString alloc] initWithString:@"test"];
self.strStrong = mutabStr;
self.strCopy = mutabStr;
NSLog(@"test:%@===%p",mutabStr,mutabStr);
NSLog(@"strStrong:%@===%p",self.strStrong,self.strStrong);
NSLog(@"strCopy:%@===%p",self.strCopy,self.strCopy);
[mutabStr appendString:@"change"];
NSLog(@"test:%@===%p",mutabStr,mutabStr);
NSLog(@"strStrong:%@===%p",self.strStrong,self.strStrong);
NSLog(@"strCopy:%@===%p",self.strCopy,self.strCopy);
打印結(jié)果:
test:test===0x60000383e550
strStrong:test===0x60000383e550
strCopy:test===0xbaf0bfda97e86f1a
test:testchange===0x60000383e550
strStrong:testchange===0x60000383e550
strCopy:test===0xbaf0bfda97e86f1a
從結(jié)果可以看出:
strong修飾的字符串窟哺,值發(fā)生了變化,內(nèi)存地址與原字符串相同
copy修飾的字符串技肩,值未發(fā)生改變且轨,內(nèi)存地址與原字符串不同,內(nèi)容拷貝
為深拷貝。
從上面的對比結(jié)果可以看出旋奢,
對于不可變對象:
使用copy和strong修飾泳挥,原對象的值的變化都不會(huì)引起賦值對象值的變化。
對于可變對象:
使用copy至朗,原對象的值的變化不會(huì)引起引用對象值的變化屉符。
使用strong修飾,在原字符串值發(fā)生改變后锹引,會(huì)引起賦值對象值變化筑煮。
在項(xiàng)目中盡量使用copy,避免出現(xiàn)上述問題粤蝎。