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