關(guān)于OC中對象與指針的思考

1. 創(chuàng)建對象:

  OC中可通過代碼Person *p = [[Person alloc] init];創(chuàng)建了一個對象p。該過程中內(nèi)存情況為:

  在當前線程的棧(默認1M)中,存在一個(Person *)類型的變量p,因為C語言中前面帶*的變量都是指針變量,故也可理解為棧中有一個Person數(shù)據(jù)類型的指針變量p(p是指針,p不光自己有地址,它4B大小的空間中存儲著別的變量的地址)。

  同時在ios系統(tǒng)管理的堆中(所有app共享)通過alloc分配了一塊能裝下Person數(shù)據(jù)類型的存儲空間(它有一個地址,假設為0x168168),通過init方法,將該存儲空間中Person數(shù)據(jù)中的成員變量的值全部初始化為0。

  指針變量p是(Person *)類型,它4B的空間中存儲著堆中[Person alloc]出來的那塊內(nèi)存空間的內(nèi)存地址0x168168。 從此以后我們就會稱指針變量p為一個對象,可以直接通過p來訪問對象內(nèi)存成員變量,調(diào)用對象內(nèi)部的地址。


2. 總結(jié):

    在OC中,從本質(zhì)上看,對象是堆內(nèi)存中按照某XXClass數(shù)據(jù)類型(類) alloc出來的一塊有地址的內(nèi)存空間,但這塊內(nèi)存空間必須要有棧中的某個指針(XXClass類型)指向它,否則它的引用計數(shù)為0,就會被系統(tǒng)自動回收。

    所以,在OC中,從表面上看,對象就是存在于棧中的某XXClass類型的指針變量(如Person *p),但是要求該指針變量中必須保存著堆內(nèi)存中的一塊有地址的內(nèi)存(NSNull空對象也有地址),這樣的指針變量才是對象。

舉例:

Person *p = [[Person alloc] init];//可以說p是對象Person *m;// 不能說m是對象,它只是Person數(shù)據(jù)類型的一個指針變量Person *n = p;//可以說n是對象,因為將p賦值給n,n和p都保存著堆中alloc出來的內(nèi)存塊(真正的對象)的地址0x168168,并且此時堆中的內(nèi)存塊的引用計數(shù)為2

3. 特殊的數(shù)據(jù)類型及其變量

在OC中常用的數(shù)據(jù)類型主要有: 基本數(shù)據(jù)類型(int/float/char/double等)、 系統(tǒng)框架類、 自定義類。

除了以上幾種常用的,還有一些定義在<objc/objc.h>頭文件中的本身就是指針的數(shù)據(jù)類型(如id類型、Class類型、Sel類型、Method類型、Ivar類型等),這些自身就是指針的數(shù)據(jù)結(jié)構(gòu),在用它們定義指針變量(OC表面上的對象)時,是不需要加*號的。

如 id boy = [[Person alloc] init]; ? ?Class personClass = [Person class]; //類方法來創(chuàng)建類對象


//以下均定義在 <objc/objc.h>頭文件中

/// An opaque type that represents an Objective-C class.

typedef struct objc_class? *Class; //帶*號的Class是指針類型

/// A pointer to an instance of a class.

typedef struct objc_object? *id;? //帶*號的id是指針類型

/// An opaque type that represents a method selector.

typedef struct objc_selector *SEL;? ? //帶*號的id是指針類型

/// An opaque type that represents a method in a class definition.

typedef struct objc_method *Method;? //帶*號的id是指針類型

/// An opaque type that represents an instance variable.

typedef struct objc_ivar *Ivar;? ? //帶*號的id是指針類型

/// An opaque type that represents a category.

typedef struct objc_category *Category;? //帶*號的id是指針類型

/// An opaque type that represents an Objective-C declared property.

typedef struct objc_property *objc_property_t;? //帶*號的id是指針類型

//創(chuàng)建類對象

Class personClass = [Personclass];

NSLog(@"類對象:%@--%p",personClass,personClass);

//類對象:Person--0x100ea03a8

//id類型

idboy = [[Manalloc]init];

NSLog(@"id類型:%@--%p",boy,boy);

//id類型:<Man: 0x7f8c89f230b0>--0x7f8c89f230b0


4. 綜上:OC中所有的對象表面上看都是存儲著堆中內(nèi)存塊地址的 (xxx類 *)p 或者 (指針類型)p 的指針。而真正的對象是堆內(nèi)存中的【xxx類 alloc】出來的內(nèi)存塊。?


文章原創(chuàng),轉(zhuǎn)載請注明出處:http://www.cnblogs.com/stevenwuzheng/p/5501266.html

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

相關(guān)閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 30,281評論 8 265
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,680評論 1 32
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,082評論 0 9
  • 一、概述 簡單的優(yōu)化一下jvm參數(shù),對應用的性能影響還是挺大的,因此隨筆一下對GC的理解。GC的術(shù)語中有兩個概念:...
    傻豬俠閱讀 879評論 0 0
  • 現(xiàn)在正是戶外運動的好季節(jié),落英繽紛、柳絮飄飄,但是也有不少的青少年為此而感到不適,原來九、十月份是過敏性鼻炎多發(fā)復...
    參漮苓a閱讀 572評論 0 0

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