1. 程式人生 > >OC 物件的記憶體儲存細節(類方法及物件方法的呼叫細節)

OC 物件的記憶體儲存細節(類方法及物件方法的呼叫細節)

//

//  main.m

//  第二個OC

#import <Foundation/Foundation.h>

/*

定義一個類:person

屬性:age heifht weight

行為:eat sleep walk

 */

@interface Person : NSObject

{

//屬性

@public

int _age;

double _height;

double _weight;

}

//行為

-(void)eat:(char *)food;

-(void)sleep;

+(void)walk;

@end

@implementation

Person

-(void)eat:(char *)food{

NSLog(@"%s",food);

}

-(void)sleep{

NSLog(@"開始睡覺");

}

+(void)walk{

NSLog(@"開始散步");

}

@end

int main(int argc,constchar * argv[]) {

//建立物件

/*

在堆中開闢儲存空間,初始化屬性

在棧中返回指標地址,這個地址其實就是類的第0個屬性的地址,但類的第0個屬性,並不是_age,而是isa,是系統自動生成的

     isa屬性其實就是儲存的指標,佔8位元組

其實類也是一個物件,也就意味

person也是一個物件

平時我們所說的建立物件就是通過一個類物件來建立一個新的例項物件

類物件是系統自動幫我們建立的,裡面包含了當前物件的所有方法

而例項物件是程式自己手動通過new來建立的,而例項物件的第0個屬性isa就是指向建立它的類物件

類的方法在記憶體中只有一份儲存空間,所有的物件公用類的方法

     */

Person *p = [Personnew];

//將堆中的儲存空間裡面的初始化的屬性值修改

    p->_age = 30;

    p->_height = 172.5;

    p->_weight = 85.5;

NSLog(@"p = %p"

,p);

NSLog(@"age = %p",&(p->_age));

/*

呼叫物件方法的步驟:根據p指標找到例項物件在堆中的儲存空間,通過例項物件找到isa指標,通過isa指標

找到類物件的儲存空間,然後找到sleep方法,呼叫sleep方法輸出資訊

     */

    [p sleep];

/*

呼叫類方法的步驟:直接記憶體中找類物件,並找到類物件的方法執行,所以類方法的執行效率比物件方法的執行效率高

     */

    [Personwalk];

    /*

當第二次呼叫new方法的時候,會重複上面的步驟,

此時在堆記憶體中存在兩個例項變數,棧記憶體中存在兩個指向例項物件的指標

如果修改p2的屬性,不會對p的屬性有影響

總結:一個類可以建立多個物件

     */

Person *p2 = [Personnew];


return 0;

}

相關推薦

物件的定義以及指向成員成員方法的指標

1.普通方法能否呼叫static方法?             能 2.普通方法能否呼叫常方法?  this        能 3.常方法能都呼叫普通方法呢? 不能    const Stack *this->func();   Stack *this   4.常方法能呼叫static方法嗎?  

OC 物件記憶體儲存細節方法物件方法呼叫細節

// //  main.m //  第二個OC類 #import <Foundation/Foundation.h> /* 定義一個類:person 屬性:age hei

C++物件記憶體模型2 虛擬函式,虛指標,虛擬函式表

C++物件記憶體模型2 (虛擬函式,虛指標,虛擬函式表) 從例子入手,考察如下帶有虛擬函式的類的物件記憶體模型: class A { public: virtual void vfunc1(); virtual void vfunc2(); void func1();

少說話多寫程式碼之Python學習040——02的函式和方法

在類裡定義函式時的self引數,其實是方法和函式的區別。在類裡定義方法時,一般都在方法里加一個預設的引數,可以是,a,c,d的。但是約定俗成就統一叫self。self表示的是 這個類的當前例項,一個類有多個例項,那麼它屬於自己所屬於的例項,不會存在例項寧缺的self會指向例項陳皮皮。 這裡比價特

的學習筆記5——靜態方法方法、例項方法屬性方法的區別

  python面試題:靜態方法、類方法、例項方法及屬性方法的區別? 1、靜態方法:處理與這個類的邏輯關聯,該方法不可訪問例項屬性或類屬性。可以通過staticmethod裝飾器實現 2、類方法:與本類相關的,方法屬於類的,只能訪問類屬性,可以通過classmethod裝飾器實現。 3

Java Adapter 介面卡模式介面卡,物件介面卡優缺點對比

介面卡模式就是把一個類的介面轉換成客戶端所期待的另外一種介面,從而使原介面不匹配而無法在一起工作的的兩個類能在一起工作。從功能上說,這些介面不相容的類一般具有相同或相似的功能。通常我們通過修改該類的介面來解決這種介面不相容的情形,但是如果我們不願意為了一個應用而修改各原介面,或者我們壓根兒就沒有物件

UMl之靜態圖圖、物件圖、包圖

一、類圖 類是具有相似結構、行為和關係的一組物件的描述符。類圖是用於定義系統中的類,包括描述類的內部結構和類的關係。類圖主要用於描述系統的靜態結構。        如何尋找類: 在待開發系統中尋找

Java物件記憶體儲存,引用傳遞,值傳遞詳細圖解

問題: Java在呼叫函式時,物件作為引數傳遞,執行函式後引數物件的值是否發生改變。 正文: 在解決這個問題之前首先得說說Java物件在記憶體中的儲存機制。 我們知道Java資料型別基本分為兩種,一是基本型別,還一種是引用型別。 基本型別: 物件型別

java儲存機制棧、堆、方法區詳解

一、java的六種儲存地址及解釋 1) 暫存器(register):這是最快的儲存區,因為它位於不同於其他儲存區的地方——處理器內部。但是暫存器的數量極其有限,所以暫存器由編譯器根據需求進行分配。你不

機房收費系統之靜態圖圖、物件

類圖的內容 一、類圖的用途 類圖是系統靜態圖的一部分,它主要用來描述軟體系統的靜態結構,當系統分析師以支援軟體系統的需求為目的設計靜態圖是通常以下述3中方法之一使用類圖。 1.對系統詞彙建模 描述系統的邊界,也就是說用來決定那些抽象是用來建模系統中的一部分,那些抽象是

BZOJ3817 Sum歐幾裏得算法

b+ pan 倒數 小數 -- 斜率 logs 如何 線下 設$t=\sqrt r$,原題轉化為$\sum_{x=1}^n(4*\lfloor\frac{tx}2\rfloor-2*\lfloor tx\rfloor)$考慮如何求$\sum_{x=1}^n\lfloor\f

Java泛型:泛型的定義、接口、對象、使用、繼承

們的 hashmap rgs println 運行 報錯 collect arr param 地址 http://blog.csdn.net/lirx_tech/article/details/51570138 1. 設計泛型的初衷: 1) 主要是為了解決Jav

python數據常用方法

方法 數據類型 文件處理一、數字數字類型包含整型、浮點型,還包含不太常用的長整型、復數。二、字符串定義:在單引號\雙引號\三引號內,由一串字符組成msg='hello world'1、切片print(msg[1:8]) #從下標為1的字符開始取,顧頭不顧尾,所以取到第七個字符

JavaScript基礎知識數據轉換、運算符

console 開頭 作用 log n) 文本 有一個 嵌套 efi 9、數據類型 概念:表示當前存儲的數據的分類(表示數字 - 整數和小數) u 原始類型(原始值) -----【typeof運算符:判斷變量的原始類型】 *number(數字):表示數字

C# 圖解教程 型 存儲和變量

圖解 和數 引用 htm 執行 C# 值類型 jit IT    1. C#程序是一組類型聲明 C一組函數和數據類型 C++一組函數和類    2.圖 3-2 類型就是模版    3.棧存儲的數據: 某些類型變量的值 程序當前的執行環境(不明白)

Uml 建模 一圖建模和startuml的使用

general 改名 ring 符號 任務 部件 實現類 exp mod 本文將分三個部分介紹Uml建模:Uml建模的作用、類圖、startuml的使用 Uml的作用    本文以java為例介紹Uml,在當前的軟件開發中大多數使用面向對象開發(OO),面向對象的就是將現實

最長公共子串LCS問題動態規劃備忘錄方法

動態規劃與備忘錄的LCS實現 動態規劃從下到上積累能量,中間值全部記錄以方便後期計算時呼叫,但有些時候很多記錄的值用不到,這個時候備忘錄方法則更好,可以減少記錄的值,其特點是自上到下,記錄少部分值。以LCS最長公共子串問題威力,分別給出兩種實現。 動態規劃法: pa

面向物件——普通方法構造方法帶參方法方法過載

普通方法   類的方法是為了完成某個特定的應用程式功能存在的,我們要實現程式的某些功能的時候,一般都是某些類的功能,比如上一篇中的學生類,有一個展示學生資訊的方法,我們就可以把它放到學生類裡面(因為只要是學生,他就都有這個展示資訊的功能),而方法是有返回值的,也可以沒有返回值,返回型別為void。有返回值的

JVM GC調優2-----GC演算法判定物件可以被回收部分摘自深入理解Java虛擬機器

這次我們介紹JVM中的GC演算法 引用計數法 可達性分析法 首先我們提出四個問題 哪裡的記憶體需要回收? 什麼時候回收? 如何回收? Java與C++之間有一堵由記憶體動態分配和垃圾收集技術所圍成的“高牆”, 牆外面的人想進去, 牆裡面的人卻想出來。

C# 反射詳解:定義、建立物件呼叫例項方法靜態方法

    1、反射的定義及功能介紹:審查元資料並收集關於它的型別資訊的能力。元資料(編譯以後的最基本資料單元)就是一大堆的表,當編譯程式集或者模組時,編譯器會建立一個類定義表,一個欄位定義表,和一個方法定義表等。可能這些說的比較抽象。我再從另一個角度來說:反射是.Net中