OC 30 day
棧 儲存局部變量。
堆 工程師手動申請的字節空間 malloc calloc realloc函數。
BSS段 儲存未被初始化的全局變量,靜態變量。
數據段(常量區) 儲存已被初始化的全局,靜態變量,常量數據。
代碼段 儲存代碼。
當程序運行期間,當某個類第一次被訪問到的時候,會將這個類儲存到內存中的代碼段區域。這個過程叫做類加載。
只有類在第一次被訪問時,才會做類加載。
一但類被加載到代碼段以後,直到程序結束的時候才會被釋放掉。
假設下面這段寫在函數之中
Person *p1 = [Person new];
@interface Person : NSObject
{
@public
NSString *_name;
int _age;
}
-(void)sayHi;
@end
@implementation Person
-(void)sayHi
{
NSLog(@"大家好,我叫%@,我今年%d歲",_name,_age);
}
@end
int main(int argc, char * argv[]) {
Person *p1 = [Person new];
NSLog(@"p1 = %p",p1);
return 0;
}
首先來執行這一段代碼,
我們會發現 *p1 的確是一個地址
那麼 p1的對象還有一個isa指針。
下一個斷點來看看
我們發現p1對象裡面確實有一個isa的指針,但是我們無法對他進行訪問。
不同的對象,指向的是同一個記憶體
6. 對象的屬性默認值:如果我們創建一個對象,沒有為對象的屬性復職,那麼這葛對象的屬性是有值的。如果屬性的類型是基本的數據類型,默認值是0,如果屬性的類型是C語言的指針類型,那麼就服值為NULL。如果屬性的類型是OC的類指針類型,那麼就賦值為nil。
補充 isa
https://stackoverflow.com/a/3405240/10172299
Under the hood, Objective-C objects are basically C structs. Each one contains a field called isa, which is a pointer to the class that the object is an instance of (that's how the object and Objective-C runtime knows what kind of object it is).
isa 是一種類別記號,透過在 C structure 內固定紀錄這個值,使得型別系統可以被記錄,尤其在 subclass 的時候使用 super 時使用