Objective-C 類和對象參數語法 隨手記3

一、內存中的五大區域

  • 棧 存儲局部變量
  • 堆 程序員手動申請的字節空間
  • BSS段 存儲未被初始化的全局變量、靜態變量
  • 數據段(常量區) 存儲已被初始化的全局、靜態變量、常量數據
  • 代碼段 存儲代碼、存儲程序的代碼

二、類加載

  • 在創建對象的時候,要訪問類
  • 聲明一個類的指針變量會訪問類

當程序運行期間,當某個類第一次被訪問到的時候,會將這個類存儲到內存中的代碼段區域,這個過程叫做類加載。只有類第一次被訪問的時候纔會做類加載,一旦類被加載到代碼段後,直到程序結束纔會被釋放

三、對象在內存中究竟是如何存儲的

Person *p1 = [Person new];
  1. Person *p1;  會在內存當中申請一塊空間,在棧內存中聲明1個Person類型的指針變量p1,p1是1個指針變量,只存儲地址
  2. [Person new];  真正在內存中創建對象的代碼 

new在做的事情

  • 內存中申請1塊合適大小的空間
  • 在這個空間中根據類的模版創建對象
  • 類模版中定義了什麼屬性,就將這些屬性一次的生命在對象當中
  • 對象中除了自己類中定義的屬性,還有另外一個屬性叫做 isa  是一個指針 只想對象所屬的類在代碼段中所存的地址
  • 初始化對象的屬性,如果是基本數據類型則賦值爲0,如果是C語言的指針類型則爲NULL,若是OC的類指針類型則賦值爲nil
  • 返回對象的地址 於是Person *p1 = [Person new];  將地址賦值給p1

 

  • 對象中只有屬性,沒有方法,自己累的屬性外加1個isa指針指向代碼段中的類
  • 訪問對象的屬性 指針名->屬性名;
  • 調用方法 :[指針名 方法名]根據isa指針找到類中的方法

爲什麼不把方法存儲在對象之中是因爲浪費空間

四、nil和NULL

1、NULL 可以作爲指針變量的值,如果1個指針變量的值是NULL代表 這個指針不指向內存中的任何1塊空間 NULL其實等價於0

2、nil 只能作爲指針變量的值,代表指針變量不只想內存當中的任何空間 nil也等價於0 也是一個宏

所以NULL和nil是一樣的

3、一般C指針用NULL OC類指針用nil

4、如果一個類指針的值爲nil 代表這個指針不指向任何對象。

      Person *p1 = nil;

  • 此時如果通過p1指針去訪問p1指針指向的對象的屬性 這個時候會運行報錯
  • 此時如果通過p1指針去調用對象的方法 運行不會報錯

五、分組導航標記

快速尋找標記位置

#pragma mark 分組名
//在導航條對應的位置顯示1個標題
#pragma mark -
//在導航條對應位置顯示1條水平分割線

六、方法與函數

//函數
void test(){
}
//方法
-(void)sayHi;

七、多文件開發

不把所有類寫在同一個.m源文件之中,不利於團隊開發

一個類寫在一個模塊當中,而1個模塊至少包含兩個文件

  • .h 頭文件 寫類的聲明
  • .m 實現文件 寫類的實現

直接創建Cocoa Class即爲 一個模塊兩個文件

八、對象作爲方法的參數

當對象作爲方法的參數的時候,參數應該怎麼寫 參數類型是類指針

-(void)test:(Dog *)dog;

調用方法是 如果方法的參數是一個對象,那麼實參時,要是一個符合要求的對象

//  Person.h

#import <Foundation/Foundation.h>
#import "Dog.h"
@interface Person : NSObject
{
    @public
    NSString *_name;
    int _age;
}
-(void)sayHi;
-(void)testWith:(Dog *)dog;

@end


//  Person.m

#import "Person.h"

@implementation Person

-(void)sayHi
{
    NSLog(@"hello");
}
-(void)testWith:(Dog *)dog
{
    [dog shoot];
}
@end


//
//  Dog.h

#import <Foundation/Foundation.h>
@interface Dog : NSObject
{
    @public
    NSString *_name;
    int _age;
}
-(void)shoot;
@end


//
//  Dog.m

#import "Dog.h"

@implementation Dog
-(void)shoot
{
    NSLog(@"wangwangwang");
}
@end


//
//  main.m


#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *p1 = [Person new];
        Dog *d1 = [Dog new];
        [p1 sayHi];
        [p1 testWith:(d1)];
        
    }
    return 0;
}



//2019-10-08 17:34:07.958000+0800 OC3[4927:715413] hello
//2019-10-08 17:34:07.958980+0800 OC3[4927:715413] wangwangwang

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章