請寫出程序執(zhí)行后的打印結(jié)果:
@property (nonatomic, strong) NSString *aStrongString;
@property (nonatomic, copy) NSString *aCopyString;
代碼1:
NSString *string = @"Hello";
self.aCopyString = string;
self.aStrongString = string;
mString = @"Hello World"
NSLog(@"aCopyString is :%@ \r\n aStrongString is :%@",self.aCopyString,self.aStrongString);
代碼2:
NSMutableString *mString = [[NSMutableString alloc] initWithString:@"Hello"];
self.aCopyString = mString;
self.aStrongString = mString;
[mString appendFormat:@"\t%@",@"World"];
NSLog(@"%@,%@",self.aCopyString,self.aStrongString);
代碼1打印結(jié)果:Hello, Hello,
代碼1打印結(jié)果:Hello, Hello World
解析:
本題主要考察strong和copy屬性修飾的區(qū)別以及深拷貝和淺拷貝:
1)當(dāng)string是不可變對象時(shí),copy是淺拷貝椎木,會增加string的引用計(jì)數(shù),只拷貝指針對象抑进,指向string指向的地址,strong則是強(qiáng)引用string對象芹血,增加string的引用計(jì)數(shù),指向string指向的地址,當(dāng)string的值發(fā)生改變時(shí)其指向的地址會發(fā)生改變,copy和strong修飾的對象指向的地址不會發(fā)生改變
2)當(dāng)string是可變對象時(shí),copy是深拷貝脊奋,此時(shí)只會拷貝string的值琴昆,拷貝出來的對象是不可變對象,指向新的地址,不增加string的引用計(jì)數(shù)报咳,strong則是強(qiáng)引用string對象侠讯,增加string的引用計(jì)數(shù),指向string指向的地址,當(dāng)string的值發(fā)生改變暑刃,指向的地址不會發(fā)生改變,copy修飾的對象值不會發(fā)生改變厢漩,而strong修飾的對象值會發(fā)生改變