1.assign 與 weak 區別
assign 適用于基本數據類型,weak是適用于NSObject 對象,并且是一個弱引用。
assign其實也可以用來修飾對象,那么我們為什么不用它修飾對象呢?因為被assign修飾的對象(一般編譯的時候會產生警告:Assigning retained object to unsafe property; object will be released after assignment)在釋放之后,指針的地址還是存在的,也就是說指針并沒有被置為nil,造成野指針。對象一般分配在堆上的某塊內存,如果早后續的內存分配中,剛好分配到這塊地址,程序就會崩掉。
?? 那為什么可以用assign修飾基本數據類型?因為基礎數據類型一般分配在棧區,棧區的內存會由系統自動處理,不會造成野指針。
weak修飾的對象在釋放之后,指針地址會被置為nil。所以現在一般弱引用就是weak。
weak使用場景:
?? 在ARC下,在有可能出現循環引用的時候,往往要通過讓其中一端使用weak來解決,比如:delegate代理屬性,通常就會聲明為weak。
?? 自身已經對他進行一次強引用,沒有必要再強引用一次時也會使用weak。比如:自定義IBOutlet控件屬性一般也使用weak,當然也可以使用strong。
2.strong與copy的區別
strong與copy都會使引用計數加1,但strong是兩個指針指向同一個內存地址,copy會在內存里拷貝一份對象,兩個指針指向不同的內存地址。
3.__block與__weak的區別
- __block是用來修一個變量,這個變量就可以在block中被修改__block:使用 __block修飾的變量在block代碼中會被retain(ARC下回retion,MRC下不會retain)
- __weak:使用__weak修飾的變量不會在block代碼塊中被retion,同時,在ARC下,要避免block出現循環引用__weak typedof(self)weakSelf = self;
4.block變量定義時為什么用copy?block是放在那里的?
- block本身是像對象一樣可以retain,和release。但是,block在創建的時候,他的內存分配是在棧上,可能被隨時回收,而不是在堆上,它本身的作用域是屬于創建的作用域,一旦在創建時候的作用域外面調用block將導致崩潰。通過copy可以把block拷貝(copy)到堆,保證block的聲明域外使用。
特別聲明
?? 需要注意的地方就是把block放到集合類當中去的時候,如果把直接生成的block放入到集合類中,是無法在其他地方使用block,必須要對block進行copy。
4.1block為什么不用strong?
- block如果用到了self,就會retain self,如果是strong的話,就造成了循環引用