1. 程式人生 > >OC當中野指標和記憶體洩露問題

OC當中野指標和記憶體洩露問題

定義一個Person類

其實引用計數這個問題大家可以理解為租房子的問題, 如果有retain alloc 代表這個人租了這間大房子, 拿到了一把鑰匙, 引用計數代表房子一共有的鑰匙的數量, release代表退房歸還鑰匙

Person * p = [[Person alloc] init];//房東蓋好了一間房子, 現在是房東一個人

//alloc 開闢空間,引用計數由0變為1

//retainCount,用於檢視物件的引用計數

 NSLog(@"%lu", [p retainCount]);

  Person * p1 = [p retain];// retain一次, 代表又來一個人租房

  NSLog(@"p1 = %lu", [p1 retainCount]);//引用計數1-2

        NSLog(@"%lu", [p retainCount]);//引用計數1-2

Person * p2 = p1;//沒有retain 也沒有alloc 引用計數不變. 就相當於p1帶他的朋友來住,朋友沒有鑰匙的

//release 減少引用計數(歸還鑰匙)

        [p release];//引用計數2-1

[p release];//引用計數1-0(但是如果我們去輸出的話, 可能是會顯示崩潰, 或者是1, 原因如下:)

NSLog(@"%lu", [p retainCount

]);// 首先這樣寫肯定是不對的 , 最後一次release,系統已經回收掉這塊記憶體,空間已經還給系統,空間已經不歸你管理,如果此時在訪問,就訪問了一塊沒有所有權的空間,所以下面的操作可能會出現野指標問題

我們還以上面的租房子問題為例, 現在這間房子最後一個人已經走了, 已經沒有人住了, 按說鑰匙已經全部交上去了, 但是我們現在的操作就像是又拿著他的鑰匙去開那個門, 這是非常不安全的.那為什麼有時候會崩潰而有時候可以打印出1呢, 這是因為如果這塊記憶體別人還沒有使用, 就像是房子還沒有租出去, 你再回去拿鑰匙開門還是安全的, 但是如果這間房子又已經租出去, 即已經有別的資料在使用這塊記憶體, 那你再回去開門, 那你的處境是相當的不安全有木有???

[p release];//野指標問題 +過渡釋放,這個也很好理解, 大家可以理解成有房客拿一把鑰匙, 不但要開門, 還要拿著這個鑰匙再去歸還一次, 要房東再次退房子押金, 違法了, 直接崩~

記憶體問題其實除了上面提到的野指標和過度釋放, 還有一個, 那就是記憶體洩露, 記憶體洩露我們可以理解為, 一為租客租房子最後鑰匙沒有歸還, 這樣房東也沒有辦法開啟這間房子, 這間房子就沒有辦法再租出去, 導致記憶體浪費, 當然, 房東在有別的房子出租的時候, 對於他來講並沒有太大的影響, 但是一旦這樣的房客有好多,房子不夠租, 房東掙錢會越來越慢, 最終可能導致做不下去

相關推薦

OC當中指標記憶體洩露問題

定義一個Person類 其實引用計數這個問題大家可以理解為租房子的問題, 如果有retain alloc 代表這個人租了這間大房子, 拿到了一把鑰匙, 引用計數代表房子一共有的鑰匙的數量, re

指標記憶體洩露

#import <Foundation/Foundation.h> // 1 野指標 提前釋放和重複釋放 // 2 記憶體洩露 //記憶體管理原則(配對原則):只要出現了 new,allo

(整合多篇文章)C++懸垂指標指標記憶體洩漏垃圾回收機制

C++的記憶體回收機制 當我們使用new為一個物件分配了空間之後,在這個物件結束使用之後,我們必須人為的去釋放這塊記憶體(delete) Java的記憶體回收機制  當用new 建立一個Java物件時,它可以存活於作用域之外。所以在上述程式碼中,引用 str(

淺談記憶體洩漏,指標記憶體申請

拿到quiz好難過,記憶體洩漏一個Vector一個Array秀的我頭疼。 記憶體洩漏 百度百科上的定義:記憶體洩漏(Memory Leak)是指程式中己動態分配的堆記憶體由於某種原因程式未釋放或無法釋放,造成系統記憶體的浪費,導致程式執行速度減慢甚至系統崩潰等嚴重後果。 一看定義

Java虛擬機器7:記憶體溢位記憶體洩露、並行併發、Minor GCFull GC、Client模式Server模式的區別

記憶體溢位和記憶體洩露的區別 1、記憶體溢位 記憶體溢位指的是程式在申請記憶體的時候,沒有足夠大的空間可以分配了。 2、記憶體洩露 記憶體洩露指的是程式在申請記憶體之後,沒有辦法釋放掉已經申請到記憶體,它始終佔用著記憶體,即被分配的物件可達但無用。記憶體洩露一般都是因

Android OOM:記憶體管理分析記憶體洩露原因總結

一、Android程序的記憶體管理分析 1. 程序的地址空間 在32位作業系統中,程序的地址空間為0到4GB,示意圖如下: 這裡主要說明一下Stack和Heap: Stack空間:(進棧和出棧)由作業系統控制,其中主要儲存 函式地址、函式引數、

C語言字串、指標記憶體問題總結

字串: 字串變數是字串的首地址,直到'\0'為止 字串的表示方式:1  字面值”abc”(字串常量)              &nb

java記憶體溢位棧溢位例項以及記憶體溢位記憶體洩露的區別

記憶體溢位和記憶體洩露的區別:記憶體溢位 out of memory,是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現out of memory;比如申請了一個integer,但給它存了lo

Java_記憶體溢位(Memory Overflow)記憶體洩露(Memory Leak)的區別

via: http://www.cnblogs.com/fryy/archive/2013/11/27/3445281.html 記憶體洩漏指你用malloc或new申請了一塊記憶體,但是沒有通過free或delete將記憶體釋放,導致這塊記憶體一直處於佔用狀態 記憶

空懸指標指標記憶體洩漏、記憶體溢位

  在C語言中,指標的功能十分強大,這使得在C中程式設計師對於指標的使用要十分地謹慎。那麼首先我們對於指標的使用就是要對空懸指標(dangling pointer)和野指標進行避免。   首先我們介紹空懸指標,空懸指標指的是一個指標,當它指向的物件已經被釋放的時候而自身卻沒

指標指標

Person *p = [[Person alloc] init]; /* 只要一個物件被釋放了,我們就稱這個物件為“殭屍物件” 當一個指標指向一個殭屍物件,我們就稱這個指標為“野指標” 只要給一個野指標傳送訊息就會報

記憶體溢位記憶體洩露、並行併發、Minor GCFull GC、Client模式Server模式的區別

前言 之前的文章尤其是講解GC的時候提到了很多的概念,比如記憶體溢位和記憶體洩露、並行與併發、Client模式和Server模式、Minor GC和Full GC,本文詳細講解下這些概念的區別。 記憶體溢位和記憶體洩露的區別 1、記憶體溢位 記憶體溢位指的是程式在申請記憶

關於valgrind的安裝記憶體洩露分析

程式的安裝 如果使用的是tar包安裝. valgrind# wget http://valgrind.org/downloads/valgrind-3.9.0.tar.bz2# tar -jxvf valgrind-3.9.0.tar.bz2# cd valgrind-3.

Java記憶體溢位記憶體洩露

雖然jvm可以通過GC自動回收無用的記憶體,但是程式碼不好的話仍然存在記憶體溢位的風險。 最近在網上搜集了一些資料,現整理如下: 一、為什麼要了解記憶體洩露和記憶體溢位? 1、記憶體洩露一般是程式碼設計存在缺陷導致的,通過了解記憶體洩露的場景,可以避免不必要的

Chrome V8系列--淺析Chrome V8引擎中的垃圾回收機制記憶體洩露優化策略

V8 實現了準確式 GC,GC 演算法採用了分代式垃圾回收機制。因此,V8 將記憶體(堆)分為新生代和老生代兩部分。   一、前言 V8的垃圾回收機制:JavaScript使用垃圾回收機制來自動管理記憶體。垃圾回收是一把雙刃劍,其好處是可以大幅簡化程式的記憶體管理程式碼,降低程式設計師的負擔,

如何形象的解釋記憶體洩漏指標

記憶體洩漏:首先要說到如何為一塊變數申請一塊記憶體空間。 當你要為變數a申請一塊記憶體空間的時候,需要用到malloc函式。如何申請這塊記憶體空間呢?這就變成程式的工作了。程式首先會向系統申請一塊記憶體空間,然後程式會把申請好的這塊記憶體空間的首地址賦給變數a,假設這時候變

iOS開發時OC與C的混編中,strcpy導致的記憶體溢位、指標

在最近的專案開發中,由於需要使用C語言的演算法供給OC專案呼叫,所以研究了一下OC與C的混編及.a庫的相關生成。而在混編的過程中,C語言的演算法都能正常呼叫了,但是被一個問題困擾了很長一段時間,就是在

淺談空指標棧,堆記憶體

/**    * 堆記憶體(heap):儲存每一個物件的屬性,使用一個物件時,一定需要一個對應堆記憶體的指向,而堆記憶體空間的開闢需要用關鍵字     *new,每一個物件在剛剛例項化後,裡面的屬性都是其對應資料型別的預設值,一塊堆記憶體可以被多個棧

記憶體洩露記憶體溢位的區別 (概念區別 產生原因區別 及解決辦法) 個人整理

記憶體洩露和記憶體溢位的區別 概念區別 記憶體溢位 : out of memory 指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現out fo memory 比如申請一個integer 但給它存了long才能存下的數那就是記憶體溢位 記憶體洩露 : memory leak 指程

利用動態規劃演算法解01揹包問題->二維陣列傳參->cpp記憶體管理->堆棧的區別->常見的記憶體錯誤及其對策->指標陣列的區別->32位系統是4G

1、利用動態規劃演算法解01揹包問題 https://www.cnblogs.com/Christal-R/p/Dynamic_programming.html 兩層for迴圈,依次考察當前石塊是否能放入揹包。如果能,則考察放入該石塊是否會得到當前揹包尺寸的最優解。 // 01 knap