1.所有被copy修飾的對(duì)象都會(huì)進(jìn)行深copy嗎?
答案:NO,例如block
全局block被copy修飾不會(huì)有任何變化
棧block被copy修飾會(huì)被copy到堆上
堆block被copy修飾,不會(huì)開(kāi)辟新的內(nèi)存,類似淺copy
copy/mutableCopy方法的調(diào)用
所有繼承NSObject的對(duì)象都可調(diào)用,但是由于NSObject中只有聲明,沒(méi)有實(shí)現(xiàn)NSCopying和NSMutableCopying協(xié)議,所以自定義的類型調(diào)用copy/mutableCopy會(huì)報(bào)錯(cuò),需要遵循并實(shí)現(xiàn)這兩個(gè)協(xié)議
有些類默認(rèn)已經(jīng)實(shí)現(xiàn)了這兩個(gè)協(xié)議,例如:NSString \NSArray\NSDictionary
像NSArray\NSDictionary等這些容器類對(duì)象只會(huì)進(jìn)行單層深copy
也就是說(shuō)會(huì)產(chǎn)生新的數(shù)組對(duì)象,但數(shù)組內(nèi)的元素沒(méi)有產(chǎn)生新對(duì)象,要想對(duì)數(shù)組進(jìn)行深copy,數(shù)組內(nèi)的對(duì)象元素要實(shí)現(xiàn)copy協(xié)議中的方法-copyWithZone:
- (id)copyWithZone:(NSZone *)zone {
? ? Student *copy = [[[self class] allocWithZone:zone] init];
? ? copy.name = [self.name copy];
? ? return copy;
}
并且數(shù)組也要用:
? NSMutableArray *studentsArray = [NSMutableArray new];
? [studentsArray addObject:student];
NSMutableArray *studentsArrayCopy =[[NSMutableArray alloc]initWithArray:studentsArray copyItems:YES];