一、內存中的五大區域
- 棧 存儲局部變量
- 堆 程序員手動申請的字節空間
- BSS段 存儲未被初始化的全局變量、靜態變量
- 數據段(常量區) 存儲已被初始化的全局、靜態變量、常量數據
- 代碼段 存儲代碼、存儲程序的代碼
二、類加載
- 在創建對象的時候,要訪問類
- 聲明一個類的指針變量會訪問類
當程序運行期間,當某個類第一次被訪問到的時候,會將這個類存儲到內存中的代碼段區域,這個過程叫做類加載。只有類第一次被訪問的時候纔會做類加載,一旦類被加載到代碼段後,直到程序結束纔會被釋放
三、對象在內存中究竟是如何存儲的
Person *p1 = [Person new];
- Person *p1; 會在棧內存當中申請一塊空間,在棧內存中聲明1個Person類型的指針變量p1,p1是1個指針變量,只存儲地址
-
[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