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;
}