copy屬性

一、為什么NSArray、NSDictionary、NSString聲明的時候要使用copy修飾?

  • 在OC中,父類指針可以指向子類,NSArray、NSDictionay這些都有一個可變的子類,使用copy修飾,可以使得當這些不可變的指針指向子類的時候,我們改變子類(可變的)的值,不會對父類指針產(chǎn)生影響。如果我們使用的是strong修飾,當我改變子類的值的時候,父類對象也會發(fā)生變化。

二、深拷貝和淺拷貝

深拷貝:內(nèi)容的拷貝,地址不一樣
淺拷貝:地址的拷貝。一樣的地址

三、block使用copy修飾

因為方法內(nèi)部的block變量是放在棧區(qū)的,使用copy,會將變量拷貝到堆區(qū)。在ARC中,系統(tǒng)會自動將block變量拷貝到堆區(qū),所以使用copy和strong是一樣的。

  • 那么為什么,block變量要拷貝到堆區(qū)呢?

這是因為,block在創(chuàng)建的時候,它的內(nèi)存是分配在棧(stack)上,而不是在堆(heap)上。他本身的作用域是屬于創(chuàng)建時候的作用域,一旦在創(chuàng)建時候的作用域外面調(diào)用block將導(dǎo)致程序崩潰。
使用retain也可以,但是block的retain行為默認是用copy的行為實現(xiàn)的,
因為block變量默認是聲明為棧變量的,為了能夠在block的聲明域外使用,所以要把block拷貝(copy)到堆,所以說為了block屬性聲明和實際的操作一致,最好聲明為copy。

  • 這里補充一個block引起的循環(huán)引用的問題解決方式(使用__weak聲明)

__weak CurrentViewController *blockSelf = self;
  brush.getCardInfo=^(NSDictionary *info){
  [blockSelf test];
  };

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

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

  • 前言: 在iOS 開發(fā)中 我們經(jīng)常用到 weak strong retain assign copy 屬性的修飾,...
    LikeSomeBody閱讀 674評論 1 4
  • 簡單來說,block就像一個函數(shù)指針,指向我們要使用的函數(shù)。 就和函數(shù)調(diào)用一樣的,不管你在哪里寫了這個block,...
    William__Lu閱讀 812評論 0 0
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,624評論 30 472
  • 小結(jié)第一篇,來總結(jié)一下iOS開發(fā)中有關(guān)copy的知識點。 iOS中,深拷貝和淺拷貝有什么不同? 淺拷貝 所謂的淺拷...
    Howeix閱讀 615評論 0 1
  • Doesn't it feel like these arm could go around the world?...
    Luna拿拿閱讀 197評論 0 0

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