黑馬IOS學習總結1 記憶體管理

2022-03-15 18:36:56 字數 1863 閱讀 7340

1、基本理論

alloc new (mutable)copy 這三者會使計數器+1

retain 返回其呼叫的物件本身

示例:person * p = [[person alloc] init];    // retaincount 為1 ,p是在棧記憶體中,其內儲存著指向堆記憶體中開創出來的person物件位址的值。

[p retain];  // 返回p本身,即可以寫成 p = [p retain]  此時retaincount 為2 

[p release]; // 計數器減1 retaincount 為1

[p release]; // 計數器再減1 retaincount 為0 ,將自動呼叫person物件的 dealloc方法,釋放記憶體。注意,此時,p 中仍然儲存著person物件的位址值,但此時,聯絡已經斷開了,堆記憶體中的person物件已經消除了,稱為殭屍物件!p此時也稱為野指標!

p.age = 5; // 注意,此處等於呼叫殭屍物件賦值,可能會不報錯。在xcode中開啟記憶體管理開關(殭屍物件檢查機制),就會報錯。開啟方法:edit schema --> diagnostics -->objective-c enable zombie objects 上打鉤

[p release]; // 此時會報錯。野指標指向的殭屍物件沒法release;

p = nil; // 將 p 這個野指標清空,此時稱為 空指標

[p release]; // 此處無錯,空指標指向空物件可以release

2、set方法記憶體管理

情況一:person類中有乙個屬性car

-(void) setcar:(car *) car // 自動釋放池在此行銷毀,會再次release一次其內的物件,也即再一次[p release],而此時p是野指標了,所以會報錯

錯誤寫法2:

@autorelease// 連續多次呼叫autorelease等效於自動釋放池一銷毀,會多次呼叫release,會引發野指標呼叫錯誤。

b autorelease實用技巧

若每次建立物件,都如此這般 person * p = [[[person alloc] init] autorelease]; 會顯得很繁瑣,尤其是多次建立物件。此時,可以在類中建立乙個靜態方法,示例如下:

+(id) person

這樣,每次建立物件的時候,只要 person * p = [person person];即可。

注意,這裡用self而不是person是有講究的,原因是考慮到person的子類情況。例如,goodperson 繼承 person類,如果此處不用self,而用person,那麼 goodperson *gp = [goodperson person];實際返回的還是person物件,這樣子類中的一些方法就無法使用了。

6、arc

arc的判斷準則:只要沒有強指標指向物件,就會釋放物件。

指標分兩種:

1)強指標,預設情況下,所有指標都是強指標 __strong

2)  弱指標,__weak   使用示例:__weak person * p = [[person alloc] init];

手動管理記憶體到arc的等效轉變

@propery(nonatomic,retain)  -----> @property(nonatomic,strong) 適用於oc物件

@propery(nonatomic,assign)  -----> @property(nonatomic,weak)  適用於oc物件

@propery(nonatomic,assign)  -----> @property(nonatomic,assign)  適用於基本型別

迴圈引用問題在arc中的解決:乙個屬性用strong,另乙個用weak即可。

iOS 記憶體管理總結

一 自動釋放池 自動釋放池,任何標記為自動釋放並因此新增到池中的物件,將在池本身被釋放的同時也自動釋放,程式可以有多個自動釋放池,它們還可以是巢狀的。如果程式在執行時將產生大量的臨時物件,就可能需要在程式中建立多重自動釋放池。例如 for inti 0 i 1000000 i 在執行此段 的時候會有...

ios記憶體管理總結

1.在init函式中必須呼叫 super init 函式dealloc中必須呼叫 super dealloc 2.呼叫以 alloc new copy mutablecopy 開頭函式的生成的物件,必須release 3.物件呼叫retain,必須release 4.物件可以呼叫autoreleas...

iOS記憶體管理小總結

1 引用計數機制通過可以遞增遞減的計數器來管理 記憶體。物件建立好之後,其保留計數至少為1。若保留計數為正,則物件繼續存活。當保留計數降為0時,物件就被銷毀了 2 在物件生命週期中,其餘物件通過引用來保留或者釋放此物件。保留與釋放操作分別會遞增及遞減保留計數 3 使用arc一定要記住,引用計數實際上...