1. 程式人生 > >ARC使用和注意點

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以及NSURlNSURLComponents

將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筆記(TimerHttp 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工具獲取你應用

voidvoid*的用法總結注意

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次。現在使用者輸入一個字串,我們需要求出出現次數最多