##一、基本原理 ###1.一、 什麼是內存管理ios
###1.二、引用計數器多線程
概念app
計步器的做用性能
alloc
、new
或者copy
建立一個新對象時,新對象的引用計數器默認就是1計步器操做atom
###1.3 、對象的銷燬線程
dealloc
消息dealloc
方法,在這裏釋放相關資源,dealloc
就像對象的遺言dealloc
方法,就必須調用[super dealloc]
,而且放在最後面調用dealloc
方法野指針
錯誤)##二、內存管理原則 ###2.一、原則分析指針
###2.二、誰建立,誰releasecode
alloc
、new
或[mutable]copy
來建立一個對象,那麼你必須調用release或autorelease[auto]release
##三、set方法的內存管理 若是你有個OC對象類型的成員變量,就必須管理這個成員變量的內存。好比有個orm
Book *_book
- (void)setBook:(Book *)book{ if (book != _book) { [_book release]; _book = [book retain]; } }
- (void)dealloc { [_book release]; [super dealloc]; }
##四、@property
參數對象
控制set方法的內存管理
retain
: release舊值,retain新值(用於OC對象)assign
: 直接賦值,不作任何內存管理(默認,用於非OC對象類型)copy
: release舊值,copy新值(通常用於NSString *)控制需不需生成set方法
readwrite
:同時生成set方法和get方法(默認)readonly
:只會生成get方法多線程管理
atomic
:性能低(默認)nonatomic
:性能高控制set方法和get方法的名稱
setter
: 設置set方法的名稱,必定有個冒號:getter
: 設置get方法的名稱##五、循環引用
@Class
@class
類名; 就能夠引用一個類,說明一下它是一個類#import
的區別
#import
方式會包含被引用類的全部信息,包括被引用類的變量和方法;@class
方式只是告訴編譯器在A.h文件中 B*b只是類的聲明,具體這個類裏有什麼信息,這裏不須要知道,等實現文件中真正要用到時,纔會真正去查看B類中信息.#import
了同一個文件,或者這些文件依次被#improt
,那麼一旦最開始的頭文件稍有改動,後面引用到這個文件的全部類都須要從新編譯一遍,這樣的效率也是可想而知的,而相對來 講,使用@class
方式就不會出現這種問題了#import
方式引入被引用類循環retain
解決方案
##六、autorelease
autorelease
autorelease
消息時,就會將這個對象加到一個自動釋放池中autorelease
方法時並不會改變對象的計數器,而且會返回對象自己autorelease
實際上只是把對release
的調用延遲了,對於每一次autorelease
,系統只是把該對象放入了當前的autorelease pool
中,當該pool被釋放時,該pool中的全部對象會被調用Release
// ios 5.0後。 @autoreleasepool{ // .... } // ios 5.0前 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // ..... [pool release]; // 或[pool drain];
##七、規律
NSNumber *n = [NSNumber numberWithInt:100]; NSString *s = [NSString stringWithFormat:@"jack"]; NSString *s2 = @"rose";