OC對象在內(nèi)存中的存儲位置

對象在內(nèi)存中的存儲

1. 內(nèi)存中的五大區(qū)域.

棧: 存儲?局部變量!!(連續(xù)的先進(jìn)先出!).

堆: 允許程序員手動在 堆區(qū)申請指定的連續(xù)的字節(jié)數(shù)的空間來使用.

BSS段: 存儲?未初始化?的全局變量、靜態(tài)變量.

數(shù)據(jù)段(常量區(qū)):? 存儲已經(jīng)初始化的 全局變量、靜態(tài)變量、常量數(shù)據(jù).

代碼段:存儲程序的?代碼.

2. 類加載.

1). 當(dāng)創(chuàng)建對象的時候,肯定需要訪問這個類.因為只有訪問了類才知道類中有那些成員.

2). 如果只是聲明類指針的時候,也會訪問這個類.以確定這個類型是否存在.

當(dāng)類第一次被訪問的時候, ?會將類存儲到代碼段之中. 這個過程叫做類加載.

將類的代碼存儲在代碼之中.

將類的代碼以字符串的形式存儲在代碼段中.

只有類第1次被訪問的時候,才會有類加載.

一旦類被加載到代碼區(qū).直到程序結(jié)束的時候才會被回收.

3.對象在內(nèi)存中是如何存儲的.

1). 類的本質(zhì)是:自定義的數(shù)據(jù)類型.

HMPerson *p1 = [HMPerson new];

2). HMPerson *p1;

這句話,僅僅是聲明了1個指針變量而已.這個指針變量的類型是HMPerson*.

p1是1個局部的變量.所以?p1指針變量是存儲在棧區(qū)?的.

p1是1個指針變量,所以這個變量中只能存儲地址.

本質(zhì)上來講.p1是1個指針變量 不是1個對象.

3).[HMPerson new];

這句話,才是在真正的創(chuàng)建對象.

new做的事情.

a. 在堆內(nèi)存中申請一塊合適大小的空間.

b. 在申請的這塊空間中根據(jù)類的模板創(chuàng)建對象.

類中有哪些屬性.就把類的屬性依次的挨個的一個不落的聲明在這個對象中.

對象中除了有類中定義的屬性之外,還有1個屬性叫做isa 這是1個指針.

這個isa指針指向 代碼段!! 中的類.

c. 初始化對象的屬性.為對象的屬性賦默認(rèn)值

-> 如果屬性的類型是基本數(shù)據(jù)類型.就賦值為0

-> 如果屬性的類型是C指針類型.就賦值為NULL

-> 如果屬性的類型是OC指針類型.就賦值為nil

d. 返回這個對象在堆空間中的地址.

將這個地址賦值給p1指針.

p1指針指向了堆空間中的HMPerson對象.

4). 注意

a. 對象中只有類的屬性+isa的指針. 沒有方法.

isa指針指向了代碼段中的類.

b. 如何訪問對象的屬性.

通過指針就可以找到指針指向的對象.找到對象了,就可以找到對象的屬性.

p1->_name = @"jack";

c. 如何調(diào)用對象的方法?

[p1 sayHi];

通過p1指針找到對象,發(fā)現(xiàn)是在調(diào)用方法.那么再根據(jù)對象的isa指針找到代碼段中的類.

再找到類中的對應(yīng)的方法來執(zhí)行.

d. 為什么方法不保存在對象中.

因為不管對象有多少個.方法的代碼都是一樣的.沒有必要保存多份,只保存1份就可以了.

e. 相同類的對象的isa指針的值一定都是一樣的.

4. 對象的屬性的初始值.

創(chuàng)建1個對象 如果沒有為這個對象的屬性賦值.那么這個對象的屬性是有值的.

屬性的類型是基本數(shù)據(jù)類型:? 0

OC指針:????? nil

C指針:?????? NULL

Nil

1. C語言中學(xué)習(xí)的NULL.

a). NULL是1個值. 是C語言中指針變量的值.

b). 如果1個指針的值為NULL值,就代表這個指針不指向內(nèi)存中的任何空間.

c). NULL本質(zhì)上是1個宏.

define NULL ((void*)0)

所以 NULL 和 0 等價.

2. nil

a). nil也是1個值. 它也是1個指針變量的值.

b). nil的本質(zhì)也是1個宏.

#define __DARWIN_NULL ((void *)0)

所以,nil和NULL完全是等價的.

c). 所以,如果

想要讓1個指針不指向任何空間.

可以為這個指針變量賦值為NULL nil 0

3. 使用建議

a). 如果希望C指針不指向任何空間.一般為其賦值為NULL

b). 如果希望OC指針不指向任何空間,一般賦值nil

4. 注意問題

如果1個類指針的值為nil

HMPerson *p1 = nil;

代表p1指針不指向任何對象.

1). 所以這個時候 通過p1去訪問p1指向的對象的屬性的時候,肯定的會報錯.

對象都沒有 哪里來的屬性呢?

2). 這個時候, 通過這個指針去調(diào)用方法的時候,

不會報錯.也不會崩潰.

只是沒有任何反應(yīng)的啦.

分組導(dǎo)航標(biāo)記

1. 一種快速的方式查找文件中的代碼.

Xcode 提供了導(dǎo)航條可以快速查找.

2. 分組導(dǎo)航標(biāo)記.

1). #pragma mark 標(biāo)記名.

2). #pragma mark -? 就會產(chǎn)生1條分割線.

3). #pragma mark - 標(biāo)記名.? 就會產(chǎn)生1條分割線.并取1個標(biāo)記名.

方法與函數(shù)

1. 之前在C語言中叫做函數(shù).

void test();

在OC類中定義的叫做方法.

- (void)sayHi;

2. 相同點:

1). 都封裝1段代碼,都表示1個相對獨立的功能.

2). 函數(shù)/方法 如果不被調(diào)用,那么其中的代碼是不會被執(zhí)行.

3. 不同點.

1). 語法不同.

2). 定義的位置不一樣.

a. 函數(shù)除了函數(shù)的內(nèi)部和@interface的大括弧中不能定義.其他的地方都是可以定義的.

b. 而方法的聲明只能在@interface的大括弧的外面,實現(xiàn)只能在@implementation中.

就算把函數(shù)寫在類中,這個函數(shù)也不是屬于這個類的.

3). 歸屬感不同.

a, 函數(shù)就像是1個沒有家的孩子,每1個函數(shù)是孤立的.]

b. 方法是屬于類的.類就是方法的家.

4). 調(diào)用形式不同.

a. 函數(shù)直接調(diào)用.

b. 方法必須要通過對象名來調(diào)用.

oc學(xué)習(xí)之對象在內(nèi)存的位置的更多相關(guān)文章

OC學(xué)習(xí)16——對象歸檔

轉(zhuǎn)載自 ?OC學(xué)習(xí)篇之---歸檔和解擋 OC中的歸檔就是將對象寫入到一個文件中,Java中的ObjectInputStream和ObjectOutputStream來進(jìn)行操作的.當(dāng)然在操作的這些對象都 ...

JVM學(xué)習(xí)03_new對象的內(nèi)存圖講解,以及引出static方法(轉(zhuǎn))

目錄 -=-講解對象創(chuàng)建過程中,-=-堆內(nèi)存和棧內(nèi)存的情況 -=-構(gòu)造函數(shù)對類對象的成員變量的初始化過程 -=-構(gòu)造函數(shù)出棧 -=-類的方法在不訪問類對象的成員變量時造成的內(nèi)存資源浪費怎么解決? -= ...

Java基礎(chǔ)(2)面向?qū)ο蠛头庋b,對象的創(chuàng)建和使用、java對象的內(nèi)存圖

1 類和對象 類:是一類事物的描述,抽象的.貓 對象:是一類事物的實例,具體的.某只貓 2 類的定義 成員變量和成員方法 //定義一個學(xué)生類 public class Student { //成員變量 ...

OC學(xué)習(xí)10——內(nèi)存管理

1.對于面向?qū)ο蟮恼Z言,程序需要不斷地創(chuàng)建對象.這些對象都是保存在堆內(nèi)存中,而我們的指針變量中保存的是這些對象在堆內(nèi)存中的地址,當(dāng)該對象使用結(jié)束之后,指針變量指向其他對象或者指向nil時,這個對象將稱 ...

OC學(xué)習(xí)5——類和對象

1.OC是在C語言基礎(chǔ)上進(jìn)行擴(kuò)展得到的一門面向?qū)ο蟮某绦蛟O(shè)計語言,它也提供了定義類.成員變量和方法的基本功能.類可以被認(rèn)為是一種自定義的數(shù)據(jù)類型,使用它可以定義變量,所有使用類定義的變量都是指針類型的 ...

oc對象的內(nèi)存管理

oc沒有java的垃圾回收機(jī)制,所以對象的內(nèi)存釋放很重要,基本數(shù)據(jù)類型,我們不用理會,編譯器會處理: oc的每個對象內(nèi)部都由一個計數(shù)器,用來記錄當(dāng)前有幾個指針在指向該對象:當(dāng)計數(shù)器為0時該對象會從內(nèi)存 ...

ios開發(fā):OC對象的內(nèi)存分析

最近要開始準(zhǔn)備找實習(xí)單位了,做做筆試題,看看各位大神的面試經(jīng)歷,發(fā)現(xiàn)自己要學(xué)習(xí)的東西真的還有很多,雖然也做過幾個的項目,但是真正拿過筆試題一看,才發(fā)現(xiàn)自己對基礎(chǔ)這方面的東西,確實有點忽視了,所以最近開 ...

OC學(xué)習(xí)6——面相對象的三大特性

我們在學(xué)習(xí)Java的時候都知道,類有三大特性:繼承,封裝,多態(tài),這也是面向?qū)ο蟮娜筇卣?OC學(xué)習(xí)篇之---類的三大特性(封裝,繼承,多態(tài)) 1.封裝(Encapsulation)是指將對象的狀態(tài)信息 ...

[javase學(xué)習(xí)筆記]-6.3 對象的內(nèi)存體現(xiàn)

這一節(jié)我們來簡單的看一看對象在內(nèi)存中是什么樣子呢,怎樣體現(xiàn). 我們以上一節(jié)的測試代碼為例. 我們在函數(shù)的內(nèi)存分配分析過.當(dāng)該代碼執(zhí)行時,首先會載入主函數(shù)在棧內(nèi)存中為main函數(shù)分配一個空間: 然后執(zhí)行 ...

隨機(jī)推薦

mysql中的行轉(zhuǎn)列

//查看當(dāng)前商品庫存 function checkProductStock($product_id){ global $wpdb; $sql="SELECT post_id,max(if(( ...

redis 擴(kuò)展 安裝 和 memcached 安裝

在Windows下為PHP5.6安裝redis擴(kuò)展和memcached擴(kuò)展 ? 一.php安裝redis擴(kuò)展 ? 1.使用phpinfo()函數(shù)查看PHP的版本信息,這會決定擴(kuò)展文件版本 ? ? ? ...

EventBus初理解

緣由: ? ? 平時工作,因為懶于動筆的原因,也沒注重技術(shù)和經(jīng)驗的積累,導(dǎo)致之前曾經(jīng)研究過的問題現(xiàn)在又忘記了,所以要慢慢注重積累,那么就從寫作開始,談?wù)剬ぷ髦信龅降膯栴}進(jìn)行整理和歸納. ? ? 我們 ...

dedecms網(wǎng)站欄目增加縮略圖的方法-測試通過

有時候因為網(wǎng)站功能需求,我們需要為織夢程序的欄目頁添加縮略圖功能,這里有一個欄目添加縮略圖的方法,供大家參考 涉及到文件如下(注意備份): dede/catalog_add.php dede/cata ...

alibaba筆試

1.D? A(7,7)/(A(3,3)A(2,2)) = 420 關(guān)聯(lián): 字符串的排列和組合:http://blog.csdn.net/hackbuteer1/article/details/7462 ...

傳輸層:TCP UDP SCTP

總圖 雖然協(xié)議族被稱為“TCP/IP”,但除了TCP和IP這兩個主要協(xié)議外,還有許多其他成員.圖2-1展示了這些協(xié)議的概況. 圖2-1中同時展示了IPV4和IPV6.從右向左看該圖,最右邊的5個網(wǎng)絡(luò)應(yīng) ...

【python之旅】python的面向?qū)ο?/a>

一.面向過程 VS 面向?qū)ο?1.編程范式 編程是程序員用特定的語法+數(shù)據(jù)結(jié)構(gòu)+算法組成的代碼來告訴計算機(jī)如何執(zhí)行任務(wù)的過程,一個程序是程序員為了得到一個任務(wù)結(jié)果而編寫的一組指令的集合,實現(xiàn)一個任務(wù)的 ...

ORM基礎(chǔ)之ORM介紹和基礎(chǔ)操作

一.ORM介紹 1.ORM概念 對象關(guān)系映射(Object Relational Mapping,簡稱ORM)模式是一種為了解決面向?qū)ο笈c關(guān)系數(shù)據(jù)庫存在的互不匹配的現(xiàn)象的技術(shù). 簡單的說,ORM是通過 ...

flask、tornado、BaseHTTPServer性能簡單對比

最近寫了一個web應(yīng)用,分別用flask.tornado.BaseHTTPServer都實現(xiàn)了一次,順便就對比了一下三者的性能,本結(jié)果僅對本次測試負(fù)責(zé)(這句話很內(nèi)涵,值得推廣). 測試工具用了ab,時 ...

Velodyne VLP-16 gmapping 建圖

1. 測試環(huán)境 Ubuntu 16.04 x64.ROS Kinetic.Velodyne VLP-16.RoboWare Studio 2. 安裝 ROS 功能包 sudo apt-get inst ...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容