strong,copy和__weak,__block的區(qū)別

在面試過(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)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容