Automatic Reference Counting(ARC)特性學習(iOS5新特性學習之五)
首先,先不談ARC,先上一張圖,弄清楚iOS下記憶體管理的基本原理:
這就是手動記憶體管理的原理,通過對物件應用的計數來判斷何時(計數為0時)銷燬物件,現在ARC自動為你做了這一切,當然,ARC是在編譯的時候自動在目的碼裡面恰當的地方加了一些retain, release, 和autorelease語句而已。所以,如果使用ARC來進行記憶體管理,則可以把關注點更多地放在程式碼邏輯等方面,而不用牽絆於記憶體地釋放等問題了。下面談談應用ARC的一些規則:
1、關於ARC的適用範圍:只能在iOS4和iOS5上使用,如果使用了weak references,就只能在iOS5上使用了。
2、Apple推薦在所有的新工程中使用ARC來進行記憶體管理,針對老的應用,XCode4.2也提供了一個工具來進行轉換(Edit-Refactor-Convert to Objective-ARC)。轉換的規則包括:
(1)去掉所有的retain、release、autorelease
(2)把 NSAutoReleasePool替換為@autoreleasepool {}塊
(3)把@property(assign)變為@property(weak)
3、使用ARC的若干強制性規定
(1)不能顯式地呼叫dealloc方法,不能實現或呼叫retain, release, retainCount或者autorelease方法。當然,包括使用@selector(retain)這樣的方式來呼叫也不行。
(2)可以自己實現一個dealloc方法來管理一些資源,但不不能用來釋放例項變數,注意自定義dealloc方法式不要去呼叫[super dealloc],即父類的dealloc方法,否則會引起編譯錯誤。在ARC下,對父類的dealloc同樣有編譯器來自動完成。
(3)對於Core Foundation型別的物件來說(基本型別),仍然可以使用CFRetain, CFRelease這些方法
(4)不能夠再使用NSAllocateObject和NSDeallocateObject物件
(5)不能都在C結構體中使用物件指標,如果要實現類似的功能,可以建立一個Objective-C類來管理這些物件。
(6)在id和void *之間沒有簡便的轉換方法,同樣的,在Objective-C物件和Core Foundation型別之間的轉換都需要使用編譯器指定的轉換函式。
(7)不能再使用NSAutoreleasePool物件了,ARC提供了@autoreleasepool塊來替代它,這會更加有效率。
(8)不能使用記憶體儲存區了,即不能再使用NSZone,這早已是被Objective-C的執行時拋棄的東西
(9)不能以new為開頭來給一個property命名
(10)宣告outlet時,一般都應當使用weak,除了對StoryBoard Segue這樣nib中間中的頂層物件,就要用strong了。
4、對工程中的單個檔案指定不使用arc的方法:在targets的build phases選項下Compile Sources下選擇要不使用arc編譯的檔案,雙擊它,輸入-fno-obj-arc即可,如下圖:
相關文章
- JDK 1.8 新特性學習(Stream)JDK
- Java1.8新特性學習Java
- JDK11新特性學習(二)JDK
- JDK11新特性學習(一)JDK
- C++ 11 新特性 nullptr 學習C++Null
- Flutter學習之Dart語法特性FlutterDart
- JDK 新特性學習筆記之模組系統JDK筆記
- JDK8 新特性學習筆記JDK筆記
- jdk-1.8新特性學習筆記JDK筆記
- JDK8新特性學習總結JDK
- 學習筆記~1.4 HTML5新特性筆記HTML
- 一起學習React18 新特性React
- Python學習之高階特性Python
- [Java學習筆記]JDK1.8新特性學習(一)Lambda表示式Java筆記JDK
- MySQL 5.7 學習心得之安全相關特性MySql
- 深圳Java培訓學習:Java8.0新特性之Lambda表示式Java
- 學習Rust泛型與特性Rust泛型
- C#特性學習筆記C#筆記
- 2019 年的 JavaScript 新特性學習指南 | 掘金年度徵文JavaScript
- OceanBase學習之路11|體驗 DDL 新特性(Oracle 模式)Oracle模式
- OceanBase學習之路12|體驗 DDL 新特性(MySQL 模式)MySql模式
- Go型別特性-學習筆記Go型別筆記
- Oracle 11g DG新特性--Automatic block repairOracleBloCAI
- 學習七、ES2016與ES2017的新特性
- 正規表示式學習(2)---字元特性字元
- NgRx Selector 的 Memoization 特性學習筆記筆記
- Solidity初學-0.8新特性Solid
- 通過示例來學習ES2016, 2017, 2018的新特性
- 推薦一個學習php8的新特性的文件PHP
- Java 基礎學習系列一 —— Java 主要特性Java
- cocos2D-x初探學習筆記(31)2.1新特性CCPhysicsSprite筆記CSS
- OceanBase學習之路13|體驗多租戶特性
- 015 透過連結串列學習Rust之使用ArcRust
- 015 通過連結串列學習Rust之使用ArcRust
- PHP開發者應該學習、會用10個PHP7新特性PHP
- 學習 iOS14 新特性,教你如何建立一個優秀的 App ClipiOSAPP
- 深入學習MySQL事務:ACID特性的實現原理MySql
- MySQL 學習筆記(一)MySQL 事務的ACID特性MySql筆記