對象在內(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)文章
轉(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 { //成員變量 ...
1.對于面向?qū)ο蟮恼Z言,程序需要不斷地創(chuàng)建對象.這些對象都是保存在堆內(nèi)存中,而我們的指針變量中保存的是這些對象在堆內(nèi)存中的地址,當(dāng)該對象使用結(jié)束之后,指針變量指向其他對象或者指向nil時,這個對象將稱 ...
1.OC是在C語言基礎(chǔ)上進(jìn)行擴(kuò)展得到的一門面向?qū)ο蟮某绦蛟O(shè)計語言,它也提供了定義類.成員變量和方法的基本功能.類可以被認(rèn)為是一種自定義的數(shù)據(jù)類型,使用它可以定義變量,所有使用類定義的變量都是指針類型的 ...
oc沒有java的垃圾回收機(jī)制,所以對象的內(nèi)存釋放很重要,基本數(shù)據(jù)類型,我們不用理會,編譯器會處理: oc的每個對象內(nèi)部都由一個計數(shù)器,用來記錄當(dāng)前有幾個指針在指向該對象:當(dāng)計數(shù)器為0時該對象會從內(nèi)存 ...
最近要開始準(zhǔn)備找實習(xí)單位了,做做筆試題,看看各位大神的面試經(jīng)歷,發(fā)現(xiàn)自己要學(xué)習(xí)的東西真的還有很多,雖然也做過幾個的項目,但是真正拿過筆試題一看,才發(fā)現(xiàn)自己對基礎(chǔ)這方面的東西,確實有點忽視了,所以最近開 ...
我們在學(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ī)推薦
//查看當(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ò)展文件版本 ? ? ? ...
緣由: ? ? 平時工作,因為懶于動筆的原因,也沒注重技術(shù)和經(jīng)驗的積累,導(dǎo)致之前曾經(jīng)研究過的問題現(xiàn)在又忘記了,所以要慢慢注重積累,那么就從寫作開始,談?wù)剬ぷ髦信龅降膯栴}進(jìn)行整理和歸納. ? ? 我們 ...
dedecms網(wǎng)站欄目增加縮略圖的方法-測試通過
有時候因為網(wǎng)站功能需求,我們需要為織夢程序的欄目頁添加縮略圖功能,這里有一個欄目添加縮略圖的方法,供大家參考 涉及到文件如下(注意備份): dede/catalog_add.php dede/cata ...
1.D? A(7,7)/(A(3,3)A(2,2)) = 420 關(guān)聯(lián): 字符串的排列和組合:http://blog.csdn.net/hackbuteer1/article/details/7462 ...
總圖 雖然協(xié)議族被稱為“TCP/IP”,但除了TCP和IP這兩個主要協(xié)議外,還有許多其他成員.圖2-1展示了這些協(xié)議的概況. 圖2-1中同時展示了IPV4和IPV6.從右向左看該圖,最右邊的5個網(wǎng)絡(luò)應(yīng) ...
一.面向過程 VS 面向?qū)ο?1.編程范式 編程是程序員用特定的語法+數(shù)據(jù)結(jié)構(gòu)+算法組成的代碼來告訴計算機(jī)如何執(zhí)行任務(wù)的過程,一個程序是程序員為了得到一個任務(wù)結(jié)果而編寫的一組指令的集合,實現(xiàn)一個任務(wù)的 ...
一.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,時 ...
1. 測試環(huán)境 Ubuntu 16.04 x64.ROS Kinetic.Velodyne VLP-16.RoboWare Studio 2. 安裝 ROS 功能包 sudo apt-get inst ...