在面試過(guò)程中,一些面試官很喜歡問(wèn)你strong和copy的區(qū)別,在這里我做一個(gè)個(gè)人理解的總結(jié):
首先回答概念性問(wèn)題:
strong,其實(shí)就是retain的意思,只不過(guò)ARC,MRC的用法,strong就是強(qiáng)引用,引用計(jì)數(shù)器會(huì)加1,
copy,顧名思義,就是拷貝,但是通常來(lái)說(shuō)分為兩種情況,淺拷貝和深拷貝,對(duì)于NSString對(duì)象來(lái)說(shuō)就是淺拷貝,但是對(duì)于NSMutableString來(lái)說(shuō)就是深拷貝,這同樣適用于NSArray等
至于淺拷貝和深拷貝,簡(jiǎn)單點(diǎn)說(shuō) 淺拷貝就是拷貝了指針,兩者都指向同一個(gè)指針,深拷貝就是拷貝了內(nèi)容
NSString *A = @"1";
NSMutableString *B = [[NSMutableString alloc] initWithString:@"2"];
NSLog(@"A:%p,B:%p",&A,&B);
NSLog(@"A:%p,B:%p",A,B);
NSString *AA = [A copy];
NSString *BB = [B copy];
NSMutableString *BBB = [B copy];
NSLog(@"AA:%p,BB:%p,BBB:%p",&AA,&BB,&BBB);
NSLog(@"AA:%p,BB:%p,BBB:%p",AA,BB,BBB);
A:0x7fff5b6eba08,B:0x7fff5b6eba00**
A:0x104534350,B:0x7f9381c04ec0**
AA:0x7fff5b6eb9f8,BB:0x7fff5b6eb9f0,BBB:0x7fff5b6eb9e8**
AA:0x104534350,BB:0xa000000000000321,BBB:0xa000000000000321**
由上面可以得到結(jié)果:
NSString通過(guò)copy之后生成的新對(duì)象的內(nèi)容還是和copy之前相同
NSMutableString通過(guò)copy之后生成的新對(duì)象和內(nèi)容都和copy之前不相同
NSMutableString通過(guò)copy之后 生成的無(wú)論是NSString還是NSMutableString對(duì)象他們的內(nèi)容也都相同
Copy之后一定會(huì)生成新的對(duì)象,但是內(nèi)容與copy前是否相同取決于NSString還是NSMutableString
__weak和__block
在通常的面試當(dāng)中,你只需要回答到__weak用于解決block循環(huán)引用問(wèn)題,而__block解決block只能訪問(wèn)局部變量而不能修改的問(wèn)題
__weak typeof(self) weakSelf = self;
更深入點(diǎn)的話,詳細(xì)解釋以下各自的特點(diǎn):
__block:
1.__block適用于ARC,MRC,并且可以修飾基本數(shù)據(jù)類(lèi)型和OC對(duì)象
2.__block修飾的對(duì)象可以在block中被修改
3.__block修飾的對(duì)象不會(huì)被block強(qiáng)引用一次,而且不會(huì)出現(xiàn)循環(huán)引用問(wèn)題
__weak:
1.__weak只適用于ARC,而且只能修飾OC對(duì)象
2.__weak修飾的對(duì)象可以說(shuō)等同于@property(weak)