oc的記憶體管理初級

2021-07-06 02:58:23 字數 2665 閱讀 6559

建立乙個person類在.h,宣告屬性

//凡是語義設定使用了retain copy的屬性,其對應的例項變數都需要在dealloc方法裡面release一次

@property (nonatomic ,copy)nsstring *hobby;

@property (nonatomic , retain)nsstring *name;

@property (nonatomic ,retain)nsstring *gender;

@property(nonatomic , assign)int age ;

在person的.m中實現方法

#warning 永遠不要手動呼叫delloc方法!

從寫delloc方法當引用計數為0時自動執行此方法

//-(void)dealloc

//(✨✨✨✨)

//實現copy協議裡的方法

//淺拷貝

//-(id)copywithzone:(nszone *)zone

//深拷貝

-(id)copywithzone:(nszone *)zone

-(void)dealloc

//便利構造器記憶體管理方式

+(id)personwithname:(nsstring *)name

在main主函式中

//+alloc物件的引用計數從0到1

person *p1 = [[person alloc]init];

person *per = [person new];

//retain使物件的引用計數+1

[p1 retain];

[p1 retain];

//autorelease在將來的某一時刻物件的引用計數減1

[p1 autorelease];

//引用計數減1(release)

[p1 release];

[p1 release];

[p1 release];

//retaincount  檢測物件的引用計數(僅對我們定義的類有檢測意義);

//new 物件的引用計數從0到1

nslog(@"%lu",[p1 retaincount]);

nslog(@"%lu",[per retaincount]);

//寫在pool的建立和pool的釋放之間的**會被自動釋放池管理

//當釋放池釋放的時候,池內所有的物件都會將autorelease的釋放操作執行

//自動釋放池以棧的方式來管理當中的物件(先進後出)

//系統的類簇研究深淺拷貝

person *p6 = [[person alloc]init];

person *p7  = [[person alloc]init];

person *p8 = [[person alloc]init];

person *p9 = [[person alloc]init];

//父類指標可以指向子類物件

// nsobject *p = [[person alloc]init];

//    //子類指標不允許指向父類物件

//    person *_p = [[nsobject alloc]init];

//copy:將原來的物件拷貝乙份,保持原來的特性(不可變物件拷貝完任然為不可變對向,可變仍然為可變物件)

//mutablecopy:將原來的物件進行可變拷貝,無論原來的物件是否可變,拷貝後都是可變物件

//oc中沒有真正意義上的深拷貝.除了歸檔和反歸檔(✨✨✨✨✨✨)

//    //1.淺拷貝:不可變陣列copy為不可變陣列

//    nsarray *array1 = @[p6,p7,p8,p9];

//    

//    

//    nsarray *_array1 = [array1 copy];

//       //深拷貝:不可變陣列拷貝為可變陣列

//    nsmutablearray *mutarray = [array1 mutablecopy];

//    //2.深拷貝:可變陣列拷貝為可變陣列

//    nsmutablearray *mutarray1 = [array1 mutablecopy];

//    nslog( @"%p - %p",mutarray1,array1);

//    

//    

//    //3.可變陣列拷貝為可變陣列

// //原來的型別copy後還是什麼型別

//  nsmutablearray *_mutarray1 = [mutarray1 copy];

//    nslog(@"%p - %p",mutarray1 , _mutarray1);

//    

//    

//    

//  //4.可變陣列拷貝為可變陣列

//  nsmutablearray *_mutarray2 = [mutarray1 mutablecopy];

person *person = [[person alloc]init];

person *person1 = [person copy];

nslog(@"%@ - %@",person1 ,person);

[person release];

[person1 release];

OC 記憶體管理初級

法則 如果對乙個物件進行了alloc retain copy之後,就擁有了該物件的所有權,就必須對它進行release或者autorelease alloc 引用計數0 1 retain 引用計數 立即 1 copy release 引用計數 立即 1 autorelease 配合 autorele...

OC記憶體管理初級演練

alloc 開闢記憶體空間,並且將物件的引用計數由0變1.person per1 person alloc init 0 1 retaincount 用來獲取當前物件的引用計數 nslog lu per1 retaincount retain 將物件的引用計數加一 person per2 per1 ...

OC記憶體管理的初級理解

自己每開闢一次空間,自己要對其 自己開闢的 進行釋放 對引用計數 1,相應的也要對引用計數 1 不必管系統對空間的操作,系統會對其進行處理.1.能讓引用計數改變的五個方法 1 alloc開闢記憶體空間,將物件的引用計數 1 2 retain將物件的引用計數 1 3 copy 4 release將物件...