assign retain copy使用異同

2021-07-05 08:32:23 字數 792 閱讀 3040

1 三者的區別

首先,assign、retain、copy肯定是在arc環境下。引用計數的概念:表示物件被引用的次數。當引用計數為 0 的時候,系統就會傳送dealloc訊息來釋放記憶體。只有oc物件才有引用計數,core foundation框架的物件為c物件,沒有引用計數。

assign:用於基本資料型別,沒有引用計數,因此不存在增加或減少引用計數;

retain: 物件引用計數會+1;

copy:

1 可變物件為深拷貝(指標賦值且在堆裡面將物件賦值乙份,引用計數不變),不可變物件為淺拷貝(只對指標賦值然後引用計數+1)。所謂深拷貝就是給指標賦值且指向的物件也拷貝乙份,淺拷貝只給指標賦值不拷貝物件。

2 可變與不可變物件的轉變:不可變物件→可變物件的轉換:物件.mutablecopy。可變->不可變:物件.copy;

3 為什麼可變物件與不可變物件有深淺拷貝之分呢?很簡單,出於對節省記憶體的考慮。對於不可變物件,因為它不可變,所以無論有多少使用者,都是同乙份東西,那麼我只要在記憶體中保留乙份即可。而對於可變物件,假設甲乙都引用了a,甲改變了a,如果乙再使用可能就會引起錯誤。

2 釋放方法

release:物件引用計數-1,如果為 0 則傳送 dealloc 釋放記憶體;

autorelease:只是把物件放入自動釋放池,這是乙個編譯器屬性,編譯器會在合適的地方呼叫autorelease。 mrc 與 arc:手動管理記憶體和自動管理記憶體,(先說下引用計數)手動管理需要程式設計師呼叫 retain release 等方法來手動管理記憶體。自動管理是把物件指標放進自動釋放池,當自動釋放池被銷毀時傳送 release 訊息。

Python 使用traceback捕捉異常

在python 中使用 try except exception as e 時,如果只是單存的把e記為str e 起始翻查日誌檢查錯誤時,錯誤資訊並不完整,要記錄像pycharm裡面debug時的完成錯誤資訊,可以使用traceback模組中的format exc import traceback ...

springboot使用 async實現非同步執行緒池

工作中經常涉及非同步任務,通常是使用多執行緒技術,比如執行緒池threadpoolexecutor,但使用executors容易產生oom,需要手動使用threadpoolexecutor建立執行緒池 在springboot使用 async 可以實現非同步呼叫,配置執行緒池引數,可以簡單的實現多執行...

異或 異或相關

感謝 morning glory 贊助 異或異 或 de scri ptio ndes crip tion 給定 l,r l,r,求 i lr j lr i ji l r j l r i jl,r 1 09l,r 1 09 s olut ions olut ion 假設l 1,r 4l 1,r 4,...