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
- java8新特性學習Java
- JDK 新特性學習筆記之模組系統JDK筆記
- Automatic Reference Counting-SwiftSwift
- java 8新特性學習之五:Java 8 lambda表示式初步第五回Java
- C++ 11 新特性 nullptr 學習C++Null
- JDK11新特性學習(一)JDK
- JDK11新特性學習(二)JDK
- Flutter學習之Dart語法特性FlutterDart
- jdk-1.8新特性學習筆記JDK筆記
- JDK8新特性學習總結JDK
- JDK8 新特性學習筆記JDK筆記
- 一起學習React18 新特性React
- 學習筆記~1.4 HTML5新特性筆記HTML
- 天天學習ORACLE(三)-11G新特性Oracle
- JDK5.0新特性的學習--列舉JDK
- [Java學習筆記]JDK1.8新特性學習(一)Lambda表示式Java筆記JDK
- MySQL 5.7 學習心得之安全相關特性MySql
- Java高階特性之反射學習總結Java反射
- 【MySQL】5.7新特性之五MySql
- JDK5.0新特性的學習--泛型(下)JDK泛型
- JDK5.0新特性的學習--泛型(上)JDK泛型
- 深圳Java培訓學習:Java8.0新特性之Lambda表示式Java
- 學習Rust泛型與特性Rust泛型
- C#特性學習筆記C#筆記
- Python學習之高階特性Python
- oracle flashback特性學習總結Oracle
- Java高階特性之泛型學習總結Java泛型
- 全面學習oracle flashback特性(2.1)--Flashback Table之RECYCLEBINOracle
- ORACLE 10G 新特性(INCREMENTALLY UPDATED BACKUPS)學習Oracle 10gREM
- JDK5.0新特性的學習--後設資料JDK
- JDK5.0新特性的學習--靜態匯入JDK
- Oracle11新特性——PLSQL新特性(五)OracleSQL
- Go型別特性-學習筆記Go型別筆記
- OceanBase學習之路11|體驗 DDL 新特性(Oracle 模式)Oracle模式
- OceanBase學習之路12|體驗 DDL 新特性(MySQL 模式)MySql模式
- JDK5.0新特性的學習--可變長引數JDK