中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

《從零開始學Swift》學習筆記(Day 61)——Core

發布時間:2020-02-29 21:33:41 來源:網絡 閱讀:715 作者:tony關東升 欄目:移動開發

原創文章,歡迎轉載。轉載請注明:關東升的博客 

Swift原生數據類型、Foundation框架數據類型和Core Foundation框架數據類型之間轉換過程中,雖然是大部分是可以零開銷橋接,零開銷并不意味著內存什么都不用管。Swift類型內存管理是采用ARCFoundation類型和Core Foundation類型內存管理都是采用MRCARCCoreFoundation類型內存管理是基于C語言風格的,它有一個對象所有權的概念 

Objective-CMRC內存管理

Core Foundation的內存管理與Objective-CMRC內存管理密不可分,先介紹一下Objective-CMRC內存管理。

所有Objective-C類都繼承NSObject類,每個NSObject對象都有一個內部計數器,這個計數器跟蹤對象的引用次數,被稱為“引用計數Reference Count,簡稱RC)。當對象被創建時候,引用計數為1。為了保證對象的存在,可以調用retain方法保持對象,retain方法會使其引用計數加1,如果不需要這個對象可以調用releaseautorelease方法,releaseautorelease方法使其引用計數減1。當對象的引用計數為0的時候,系統運行環境才會釋放對象內存。

引用計數示例如圖所示,首先在第①步調用者A中創建了一個NSObject對象,這時該對象引用計數為1。在第②步調用者B中想使用這個NSObject對象,于是使用NSObject對象引用,但是為了防止使用過程中NSObject對象被釋放,可以調用retain方法使引用計數加1,這時引用計數為2。在第③步調用者A中調用releaseautorelease方法,使引用計數減1,這時引用計數為1。在第④步調用者C中調用releaseautorelease方法,只是獲得NSObject對象引用,并沒有調用retainreleaseautorelease方法,因此沒有引起引用計數的變化。在第⑤步調用者B中調用releaseautorelease方法使引用計數減1,這時引用計數為0。這個時候NSObject對象就內存就可以釋放了。 

《從零開始學Swift》學習筆記(Day 61)——Core

來總結一下:

1. 誰創建或拷貝對象,他也一定要負責調用NSObject對象releaseautorelease方法,使引用計數減1,如圖中調用者A在第①步,負責創建了NSObject對象,那么調用者A也必須是負責使引用計數減1,見第④步。

2. 誰調用retain方法使引用計數加1,它也一定要負責調用NSObject對象releaseautorelease方法,使引用計數減1,如圖中調用者B在第②步,調用者B調用NSObject對象retain方法使引用計數加1,那么調用者B也必須是負責使引用計數減1,見第⑤步。 

對象所有權

    一個對象可以有一個或多個所有者,從所有者的角度看是對這個對象具有了“所有權”,從上圖中看,調用者A和調用者B所有者,他們可能是一段程序,可能是一個對象。他們對NSObject對象具有所有權,不再使用時候他們應該負責放棄對象所有權,當對象沒有所有者時,引用計數為0,它才可以被釋放。

    如上圖如果按照對象所有權解釋:調用者A創建或拷貝NSObject對象,這時調用者A就具有了NSObject對象的所有權,見第①步。調用者B調用NSObject對象retain方法,就獲得了也NSObject對象的所有權,見第②步。調用者A調用NSObject對象release方法,放棄NSObject對象的所有權,見第③步。調用者C只是使用NSObject對象沒有獲得NSObject對象的所有權,見第④步。調用者B調用NSObject對象release方法,放棄NSObject對象的所有權,見第⑤步,但是調用者B使用這個NSObject對象過程中,由于其他調用者放棄所有權,導致NSObject對象被釋放,那么調用者B中程序就會發生運行期錯誤。

 

歡迎關注關東升新浪微博@tony_關東升。
關注智捷課堂微信公共平臺,了解最新技術文章、圖書、教程信息
 《從零開始學Swift》學習筆記(Day 61)——Core

更多精品iOSCocos、移動設計課程請關注智捷課堂官方網站:http://www.zhijieketang.com
智捷課堂論壇網站:http://51work6.com/forum.php

 

 


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

高唐县| 海晏县| 清新县| 蛟河市| 沁源县| 绿春县| 平塘县| 平阳县| 武定县| 友谊县| 玛沁县| 登封市| 张家口市| 洪雅县| 苏尼特右旗| 星子县| 嘉峪关市| 措勤县| 区。| 马公市| 乌兰浩特市| 中山市| 绥阳县| 聂荣县| 徐州市| 莆田市| 天峨县| 南郑县| 枣强县| 西城区| 天津市| 丹凤县| 临潭县| 麟游县| 城口县| 韶山市| 嘉定区| 虹口区| 哈密市| 井冈山市| 吴江市|