ARC使用和注意點
ARC(Automatic reference counting)管理,是為了提高開發者的效率,節省編寫記憶體管理的程式碼,讓開發者更關心自己的業務,並沒有真正的自動記憶體管理,而是編譯器在編譯前會檢查程式碼,判斷物件是否被強指向,如果有指標強指向這個物件,那麼這個物件就不會被回收。
區別強指標和弱指標分別用__strong和__weak,預設所有物件的指標都是強指標,而在我們物件模型構建的時候,如果一個物件依賴於另外一個物件我們就使用強指標指向,但是如果是相互包含,那麼我們一方用強指向,另外一個方用弱指向。
__strongStudent *stu=[[Studentalloc]init]; // __weakStudent *stu2=[[Studentalloc]init];//弱指標 |
student
#import <Foundation/Foundation.h> @classBook; @interface Student :NSObject @property (nonatomic,strong)Book *book; @end |
#import "Student.h" @implementation Student -(void)dealloc{ NSLog(@"物件被銷燬"); } @end |
book
#import <Foundation/Foundation.h> @interface Book : NSObject @end |
#import "Book.h" @implementation Book @end |
main
void test2(){ Student *stu=[[Studentalloc]init]; //定義一個強指向的指標*stu Student *s=stu; //定義一個強指向的指標s stu=nil; //stu被回收 NSLog(@"stu==%@",s); } |
在記憶體中的執行狀態:
從以上可以得知,當stu=nil執行後中是stu的指標被清空,所以指向student物件引用也被清空,但是s的指向並沒有被清空,所以s的值還是存在。
void test1(){ Student *stu=[[Studentalloc]init]; //弱指標 __weak Student *s=stu; stu=nil;//stu物件被銷燬 NSLog(@"s==%@",s); } |
因為指標s是弱指標,所以當指標stu銷燬的時候,Student的物件被回收,ARC如果發現一個物件沒有強指標指向,那麼它會把所有弱指標指向清空變為空指標,所以s指向的是一個空物件,所以取不到S的值
從以上得知:
1.ARC原則只要這個物件被強指標引用著,就永遠不會銷燬
2.預設情況下,所有的指標都是強型別的指標也叫強引用可以省略__strong
ARC模式注意:
1.不能呼叫release retian autorelease retaincount
2.可以重寫dealloc不能使用[super dealloc];
3.@property:想長期擁有某個物件,用strong,其他物件用weak
基本資料型別依然用assign
特殊情況一:
//這個指標永遠無法使用因為出生就被銷燬 __weakStudent *s1=[[Studentalloc]init]; |
特殊情況二(相互包含):
student&book
#import <Foundation/Foundation.h> @classBook; @interface Student :NSObject @property (nonatomic,strong)Book *book; @end |
#import "Student.h" @implementation Student -(void)dealloc{ NSLog(@"物件被銷燬"); } @end |
main
Student *stu=[[Studentalloc]init]; //強指標 Book *book=[[Bookalloc]init];//強指標 stu.book=book; book.stu=stu; |
程式執行後記憶體狀態
因為兩個物件都是強指向,那麼當程式執行完以後,區域性變數*stu和*book都被回收,但是student物件和book物件之間的指向是強指向,所以在記憶體中都沒有被釋放。
所以在我們互相依賴的時候採取以下方式,有一方採取弱指向,對student.h檔案修改
#import <Foundation/Foundation.h> @classBook; @interface Student :NSObject @property (nonatomic,weak)Book *book; @end |
當程式執行完區域性變數*stu和*book被銷燬,book變數被銷燬以後,因為book物件並沒有一個強指向的指標,在student中的book指向是弱指標,所以book物件被銷燬,當book物件被銷燬,自然對student的指向也將被銷燬,student物件也不存在強指標指向,最後都被回收。
相關推薦
ARC使用和注意點
ARC(Automatic reference counting)管理,是為了提高開發者的效率,節省編寫記憶體管理的程式碼,讓開發者更關心自己的業務,並沒有真正的自動記憶體管理,而是編譯器在編譯前會檢查程式碼,判斷物件是否被強指向,如果有指標強指向這個物件,那麼這個物件就不
vue中mixins的使用方法和注意點(詳)
mixins基礎概況 vue中的解釋是這樣的,如果覺得語言枯燥的可以自行跳過嘿~ 混入 (mixins): 是一種分發 Vue 元件中可複用功能的非常靈活的方式。混入物件可以包含任意元件選項。當元件使用混入物件時,所有混入物件的選項將被混入該元件本身的選項。 怎麼用? 舉個栗子: 定義一個混入
專案中遇到的坑和注意點 總結 持續更新
gitHub地址: 傳送門 工作中遇到的坑和思考 有不同意見歡迎指正交流 前排推薦 https://github.com/topics/javascript 關注JS開源框架動態 勤於總結和思考 1. ajax請求的結果要和後端約定好返回的資料格式。
git stash 用法總結和注意點
git stash 用法總結和注意點 2018-09-04 18:02 by 加個小雞腿, 711 閱讀, 0 評論, 收藏, 編輯 常用git stash命令: (1)git stash save "save mes
ios 常用的一些方法和注意點 componentsSeparatedByString componentsJoinedByString以及NSURl和NSURLComponents
將string字串轉換為array陣列 NSArray *array = [Str componentsSeparatedByString:@","]; 注意://componentsSeparatedByString 這個方法有一個bug 當被切割的字串是 @“”
《Netty官方文件》5.0中的變化和注意點
原文地址 譯者:葉揚V 這篇文件將引領你瞭解netty在4.1 release版本之後所做的一系列顯著升級和新特性,以便讓你能把應用升級到新版本。 不像netty在3.X和4.0之間的升級變化,5.0版本雖然在設計上做出了重大突破和簡化,但(在呼叫層面)並沒有改變很多。我們儘可能讓4.X版本
IntellJ Idea使用maven建立專案常見錯誤和注意點
新手常見錯誤: 1、想要刪除一個專案,要先關閉專案,然後去專案的儲存位置刪除,最後必須從idea的工作空間(user目錄下的IntelliJidea)中多個資料夾徹底刪除專案(不要亂刪東西),否則無法建立同名的專案。如果誤刪了外掛,可以在右側邊欄的Maven
Python,將Unicode16進位制編碼轉換為漢字方式和注意點
第一種: eval1 = eval("u" + "\'" + text + "\'") 第二種 b = bytes("abc", 'utf8') print(b.decode('utf8')) 第三種 和第一種一樣 a = '\u5386\u9633\u9547' 爬蟲得
NSThread 執行緒相關簡單說明(一些使用和注意點)
一 說明 本文涉及程式碼可以從https://github.com/HanGangAndHanMeimei/Code地址獲得。 二 NSThread的基本使用和建立 1)基本用法(主執行緒|當前執行緒) 1 //1.獲得執行該方法的當前執行緒
libevent2筆記(Timer和Http Client的應用和注意點)
1.初始化 Windows上需要自己初始化系統網路庫,即呼叫 WSADATA WSAData; WSAStartup(0x201, &WSAData); 結束使用時再 WSACleanup(); 另外還需要初始化執行緒設定 windows
JavaScript中的小技巧和注意點(二)
tip:自己收集的一些前端注意事項 1.函式優先 函式宣告和變數宣告都會被提升,但是一個值得注意的細節是函式會首先被提升,然後才是變數 foo();//1 var foo; function foo(){ console.log(1);
Android利用微信SDK分享到微信教程,回撥分享結果錯誤解決和注意點
在正式開始之前這裡要著囉嗦一下,進來的同學一定要看,在申請應用的時候要填一個簽名,這個簽名是由應用的簽名檔案keystore決定的,那麼你在填這個簽名的時候,一定要把你的應用用正式的keyStore生成apk,安裝到手機,然後用微信提供的獲取應用簽名的apk工具獲取你應用
void和void*的用法總結和注意點
void的字面意思是空型別,void *的意思是空型別指標,void 不是一個真正的型別,我們在宣告變數的時候從來不會像下面這樣宣告: void a; 如果我們寫了一行這樣的程式碼,某些編譯器會直接報錯,有些則不會,但也沒有任何意義。 void真正的用途在下面兩個
JAVA 和 C/C++ 中 string 的區別和注意點
所有的字串類都起源於C語言的字串,而C語言字串則是字元的陣列。C語言中是沒有字串的,只有字元陣列。 談一下C++的字串:C++提供兩種字串的表示:C風格的字串和標準C++引入的string型別。一般建議用string型別,但是實際情況中還是要使用老式C風格的字串。 1.C風格的字串:C
Android中Service的使用詳解和注意點(LocalService)
開始,先稍稍講一點android中Service的概念和用途吧~ Service分為本地服務(LocalService)和遠端服務(RemoteService): 1、本地服務依附在主程序上而不是獨立的程序,這樣在一定程度上節約了資源,另外Local服務因為是在同一程序因此
【系列】重新認識Java——泛型(通配、特性和注意點)
上一篇文章介紹了Java泛型中的基礎及原理,本文將繼續研究有關Java泛型的內容。本文的主要內容有: 泛型的特性 泛型通配 泛型類與普通類的不同點,也是日常開發要主要的點 泛型特性 泛型的相容性 首先要強調的是,泛型是編譯時才會檢查合法性
RTThread-筆記0用法拾遺和注意點
rtdebug.h中新增__FILE__,輔助定位檔案 #define RT_ASSERT(EX)
JavaScript中的this關鍵字的用法和注意點
JavaScript中的this關鍵字的用法和注意點 一、this關鍵字的用法 this一般用於指向物件(繫結物件); 01、在普通函式呼叫中,其內部的this指向全域性物件(window); function funcName(){this.name =
Netty 4.1中的新變化和注意點
本文帶你瞭解Netty 4.0到Netty 4.1的值得注意的改變和新特性. 題外話 儘管我們儘量保持向下相容,4.1 還是有一些和4.0不完全相容的地方. 請確保使用新的Netty版本重新編譯你的應用. 當你重新編譯你的應用時,你可以能看到一些棄用警告. 請依照修改建議
字串的使用和注意點及西大OJ20解答
題目:(http://oj.gxu.edu.cn/problem/20/) 一個字串中可能包含a~z中多個字串,並且可能會有重複,如 String data ="abcdaaa",這道字串出現次數最多的字母就是a,出現了4次。現在使用者輸入一個字串,我們需要求出出現次數最多