OC學習6 記憶體管理 下

2021-06-22 10:34:45 字數 2570 閱讀 9649

一、@property引數

1.引數可有可無。基本型別可以用

@property

(assign

)int

age; 直接賦值,寫不寫一樣的。

2.引數主要分三類:1.)讀寫屬性:

readwrite

/readonly/ 

2.) 

setter

處理:assign

/retain

/copy

2.)  原子性:

atomicity

/nonatomic

(加鎖會耗效能,盡量使用

nonatomic)

3.為了保證**的可讀性,在

bool

型別生成

getter

盡量重名為

is***

,ex:isrich

. 二、示例

以下面的程式為示例,來看看@property的引數使用

@class book;

@class card;

@inte***ce student : nsobject

// 這裡的retain代表:在set方法中,release舊值,retain新值

@property (nonatomic, retain) book *book;

@property (retain) card *card;

// readonly代表只生成get方法的宣告

// 預設是readwrite,同時生成get和set方法的宣告

@property (readonly) int age;

// atomic就代表給方法進行加鎖,保證執行緒安全

@property (atomic) int no;

// nonatomic代表方法不需要考慮執行緒安全問題

@property (nonatomic, assign) int no2;

// getter是用來指定get方法的方法名

@property (nonatomic, getter = isrich) bool rich;

@end

@implementation student

//- (void)setbook:(book *)book

//}//

//- (void)setcard:(card *)card

//}- (void)dealloc

@end

在main方法中寫個測試如下:

@autoreleasepool
三、自動釋放池(

autorelease pool)

1.自動釋放池是oc裡面的一種自動**機制,一般可以將一些變數新增到自動釋放池中統一釋放。

當自動釋放池銷毀時,池裡面的所有物件都會呼叫一次

release

方法。

2.oc物件只需要傳送一條autorelease訊息,就會把這個物件新增到最近的自動釋放池中(棧頂的釋放池) 3.

autorelease

實際上只是把對release的呼叫延遲了,對於每一次autorelease,系統只是把該物件放入當前的autorelease pool,當該pool被釋放時,該pool中的所有物件都會呼叫release。

@自動釋放池作用:統一**物件。

@說明:

1.自動釋放池被銷毀,所有物件計數器減一,並不一定會被銷毀。

2.@autoreleasepool 執行完了就銷毀自動釋放池。

3.[stu autorelease];不會馬上釋放,會交給池子管。

4.對於每乙個runloop,系統隱式建立乙個autorelease pool,並把建立好的pool放在棧頂,所有的pool會構成乙個棧式結構。在每乙個runloop結束時,當前棧頂的pool會被銷毀,這樣這個pool裡的每個物件會執行release操作。

@自動釋放池建立:

1.ios 5.0之後

@autoreleasepool

2.ios5.0之前

nsautoreleasepool *pool = [[nsautoreleasepool alloc ] init ] ;[ pool release ] ;

3.靜態物件用以快速建立物件。

4.ios開發潛規則:靜態方法返回物件都是自動釋放的。

@自動釋放池注意:

1.在arc下,不能使用 [[nsautoreleasepool alloc ] init ] ,而應當使用@autoreleasepool{}

2.不要把大量迴圈操作放在同乙個自動釋放池中,這樣會造成記憶體峰值上公升。

3.盡量避免對大記憶體使用該方法,對於這種延遲釋放機制,還是盡量少用。

4.sdk中一般利用靜態方法建立並返回的物件都是已經autorelease的,不需要再進行release操作。

四、示例

int main(int argc, const char * argv)

// 盡量不要這樣,不會及時釋放,還會造成峰值高

}return 0;

}

oc學習之旅 記憶體管理

因為以前的 都是使用非arc 手動管理 而arc還不太完善,因此學習非arc模式還是有必要的。在用非arc模式 引用計數器概念 oc中,在oc定義的型別都設計有乙個引用計數器retaincount。而oc中的引用分兩種,一種是強引用retain 對應arc中的strong 另一種是弱引用assign...

IOS學習 OC記憶體管理

記憶體管理 引用計數器 oc物件被引用的次數,為0的時候該物件被銷毀,記憶體 retain 引用次數 1 返回的是物件本身 release 引用次數 1 沒有返回值 retaincount 獲取引用次數。dealloc oc物件被銷毀的時候會呼叫dealloc方法,繼承該 方法 放最後面 super...

Oc 記憶體管理

1 對你自己擁有的物件負責,你只能釋放你擁有的物件 2 凡是你通過 retain alloc copy等手段獲得了所有者的物件,都必須在你不使用的時候來呼叫release autorelease等手段來釋放對他的所有權 3 在一定的 段內,對同乙個物件所作的copy alloc retain的操作次...