1. 程式人生 > >oc7--內存分析

oc7--內存分析

指針 手動 結構體 nslog person 文檔 con com char

//
//  main.m
//  第二個OC類

#import <Foundation/Foundation.h>

@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.通過類創建對象 /* 內存區域分為:棧、堆、代碼區(存放二進制代碼)。 1.程序啟動會把Person的代碼放在代碼區(Person的申明和實現的代碼都在代碼區了)。 2.new 創建對象會在堆中開辟存儲空間給Person對象(有屬性,屬性初始化為0)。 3.指針名在棧中。存的是Persion對象的地址(堆中的地址)。(結構體的地址是第0個元素的地址) 4.創建對象的時候返回的地址其實就是類的第0個屬性的地址,但是需要註意的是: 類的第0個屬性並不是我們編寫的_age, 而是一個叫做isa的屬性(系統添加的第0個屬性),isa是一個指針, 占8個字節。(結構體的地址是第0個元素的地址,類的本質就是結構體,所以類返回的地址就是第0個元素的地址。) 5.其實類也是一個對象, 也就意味著Person也是一個對象,平時我們所說的創建對象其實就是通過一個 類對象 來創建一個 新的對象,類對象是系統自動幫我們創建的(當Person類代碼加載到代碼區的時候系統就會根據這個代碼創建一個Person類對象,類對象存放在堆區, 裏面保存了當前對象的所有方法), 而實例對象是程序自己手動通過new來創建的, 而實例對象中有一個isa指針(第0個屬性,is a是什麽)就指向了創建它的那個類對象。p的地址就是isa的地址。 6.類方法:直接找到類對象,調用類方法。所以類方法執行的效率高。
*/ Person *p = [Person new]; p->_age = 30; p->_height = 1.75; p->_weight = 65.0; NSLog(@"age = %i , height = %f, weight = %f,isa = %p", p->_age, p->_height, p->_weight); NSLog(@"p = %p", p);//0x1002035e0 NSLog(@"&age = %p", &(p->_age));//0x1002035e8, p的地址和age的地址相差8就是isa占了8個字節,蘋果的文檔已經寫的很清楚了。
[p walk];//首先找到棧中p的地址,然後找到p的地址指向的堆中person對象的地址,然後找到isa指針,然後找到Person類對象,然後找到walk方法。 [Person demo]; ///////////////////////////////////////////// struct Person { int age; char *name; }; struct Person sp; NSLog(@"&sp = %p", &sp); NSLog(@"&age = %p", &sp.age); //結構體的地址是第0個元素的地址,類的本質就是結構體,所以類返回的地址就是第0個元素的地址。 //////////////////////////////////////////// return 0; }

技術分享

oc7--內存分析