03-07、OC類創建的對象在內存中的存儲細節

1、OC類創建的對象在內存中的存儲細節
1.開辟存儲空間, 通過new方法創建對象會在堆 內存中開辟一塊存儲空間
2.初始化所有屬性
3.返回指針地址
2、注意: 創建對象的時候返回的地址其實就是類的第0個屬性的地址,但是需要注意的是: 類的第0個屬性并不是我們編寫的_age, 而是一個叫做isa的屬性,isa是一個指針, 占8個字節。
其實類也是一個對象, 也就意味著Person也是一個對象,平時我們所說的創建對象其實就是通過一個 類對象 來創建一個 新的對象,類對象是系統自動幫我們創建的, 里面保存了當前對象的所有方法,而實例對象是程序員自己手動通過new來創建的, 而實例對象中有一個isa指針就指向了創建它的那個類對象。
3、為什么類方法的執行效率比對象方法高:因為類方法只需要在內存中只需要兩步:找到這個類名的類對象,然后再執行類方法。而對象方法需要三步:根據對象指針找到堆內存中的對象,然后根據isa找到該實例對象的類對象,然后再執行類對象方法列表中的實例對象方法。

屏幕快照 2017-09-14 10.51.20.png
屏幕快照 2017-09-14 10.47.45.png
屏幕快照 2017-09-14 10.48.35.png

===================代碼======================

#import <Foundation/Foundation.h>

/*
 要求定義一個人類
 事物的名稱: 人(Person)
 屬性: 年齡(age), 身高(height), 體重(weight)
 行為: 吃飯(eat), 睡覺(sleep), 散步(walk)
 */

@interface Person : NSObject
{
@public
// 屬性
int _age;
double _height;
double _weight;
}
// 行為
- (void)eat:(char *)food;

- (void)sleep;

- (void)walk;

+ (void)demo;

@end

@implementation Person

- (void)eat:(char *)food
{
NSLog(@"吃%s", food);
}

- (void)sleep
{
NSLog(@"開始睡覺");
}

- (void)walk
{
NSLog(@"開始遛彎");
}

+(void)demo
{
NSLog(@"demo");
}

@end


int main(int argc, const char * argv[]) {

// 1.通過類創建對象
Person *p = [Person new];
p->_age = 30;
p->_height = 1.75;
p->_weight = 65.0;

NSLog(@"age = %i , height = %f, weight = %f", p->_age, p->_height, p->_weight);
/*
//    NSLog(@"p = %p", p);
//    NSLog(@"&age = %p", &(p->_age));

[p walk];
[Person demo];
 */
/*
struct Person
{
    int age;
    char *name;
};
struct Person sp;
NSLog(@"&sp = %p", &sp);
NSLog(@"&age = %p", &sp.age);
 */

// 每次new都會創建一個新的對象, 分配一塊新的存儲空間
// 如果修改A的屬性不會影響到B的屬性
// 一個類可以創建多個對象
Person *p2 = [Person new];
p2->_age = 50;
p2->_height = 188;
p2->_weight = 100;

return 0;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容