天天看點

NSString和block的屬性時copy,而不用retain 而容器類使用retain

NSString 為什麼要使用copy,而不是retain

  • 1、首先如果使用retain,隻是引用計數+1,并沒有生成新的對象,是以效率好
  • 2、但是使用copy安全。因為NSString為NSMutableString 的基類,如果将NSMutableString 以retain的形式指派給NSString後,後續修改NSMutableString會導緻NSString内容的變化,這通常不是我們希望的,是以NSString要使用copy。

block為什麼使用copy來修飾?

  在MRC下,任何block,都是存在于棧中,這也意味着,其生命周期由系統管理,不需要我們手動管理.這就存在一個問題,那就是我們如果使用block儲存一段代碼塊,歡樂的等待被回調的時候,說不定在之前就已經被系統回收了!

但是ARC下, 使用Strong, Copy修飾Block都是可行的, 都是使Block存在在堆區, 官方建議還是使用copy, 但是使用retain就不一樣了, 使用retain修飾Block相當于使用assign; (如果使用retain的話,隻會将其計數器加一, 多做一次強引用,但不會重新配置設定新的記憶體).

block中使用的

NSLog(@"%@",_name);
             NSLog(@"%@",self->_name);

             NSLog(@"%@",self.name);
           

都會引發循環引用,其中15與16行,是等同的;

因為,block存在于堆中,在其代碼塊中引用的對象都會産生一個強指針.而這時候問題就産生了,因為block本身就被其引用的對象(copy)強指針指向着.這樣就造成了雙方都無法釋放,進而造成了記憶體洩漏.

self.block (copy) 強引用
block{….self….} 強引用
雙方都被對方強引用着, 無法釋放
           

繼續閱讀