天天看點

OC之記憶體配置設定

1.OC中記憶體管理方式分MRC和ARC兩種

MRC:手動管理引用計數。ARC:自動管理引用計數。 ARC實作的原理是MRC。 2.引起引用計數變化的方法 加1:alloc,retain,copy; 減一:release(引用計數立即減一),autorelease(在未來的某個時刻引用計數減一,這個時刻跟autoreleasepool有關); 3.操作引用技術的原則 有alloc,retain,copy就要有相應的release,autorelease;沒有的話就不進行任何操作; 4.自動釋放池(autorelease)的操作 作用:管理自動釋放(autorelease)的對象。 系統在開發者建立工程時會在應用程式的主線程中建立一個預設的自動釋放池(子線程中不建立)此釋放池生命周期為整個應用程式的生命周期。開發者添加自動釋放池使用@autoreleasepool{}(生命周期為大括号内)。如果程式中有多個自動釋放池,那麼,自動釋放的對象由離他最近的釋放池管理。如果自動釋放池和大循環一起操作,自動釋放池放在循環内部,防止産生的大量臨時對象不能被及時釋放;當應用程式和使用者之間産生互動,系統會自動幫使用者建立自動釋放池,管理互動過程中産生的臨時對象,互動結束,釋放池生命周期結束。 5.屬性的記憶體管理(assign,retain,copy) 如果屬性聲明時使用的關鍵字為assign,不需要在類内部進行記憶體管理; 如果屬性聲明時使用的關鍵字為retain和copy,需要在類内部進行記憶體管理,需要重寫dealloc方法。在dealloc中對屬性對性的對象發送release消息。eg: @interface Person : NSObject @property (retain) NSString *firstName; @property (retain) NSString *lastName; @property (assign, readonly) NSString *fullName; @end   @implementation Person // ... - (void)dealloc     [_firstName release];     [_lastName release];     [super dealloc]; } @end 6.容器類記憶體管理 将對象添加進入容器,容器對象會對容器内部對象進行引用計數的保留(也就是計數+1,retain) 從容器中移除該對象,容器會對對象release(計數-1) 容器對象進行release,會對容器的所有對象發送release(容器内所有對象減一) 7.copy 給系統類的不可變對象發送copy消息會對該對象的引用計數加1 (和retain功能相同) 如果給系統類可變對象發送copy消息會建立出不可變的副本,原對象引用計數不變,副本對象引用計數加1; 給系統類的不可變對象發送mutableCopy消息,得到的是一個可變的對象副本,源對象引用計數不變,副本引用計數+1; 給系統的可變對象發送mutableCopy消息,會得到一個可變的對象副本,源對象引用計數不變,副本+1 容器中的對象全部都是指針拷貝(淺拷貝)。 如果自定義類要實作copy方法,必須先遵守NSCopying協定,實作copyWinthZone方法。 不可變的容器在使用了mutableCopy後會變成可變的; 不論是深拷貝還是淺拷貝,容器裡面的元素都是淺拷貝; 可變的數組在接收了Copy後變成一個不可變的數組;

轉載于:https://www.cnblogs.com/shushulele/p/3866239.html

繼續閱讀