執行迴圈和自動釋放池關係
準備工作
- 新建
Person
類,將Person
類的編譯環境改成MRC
的. - 手動管理
Person
類的記憶體. - 把某個類的編譯環境改成
MRC
的 :-fno-objc-arc
Person類中宣告
@interface Person : NSObject
/// 名字
@property (nonatomic,copy) NSString *name;
/// 類方法例項化person物件
+ (instancetype)personWithName:(NSString *)name;
@end
Person類中實現
- 在
MRC
開發中,所有返回id
型別的類方法,都必須要使用autorelease
標記成延緩釋放
的物件. - 延遲釋放的物件,在出了作用域以後,會被新增到最近一次建立的自動釋放池中,等待被釋放.
+ (instancetype)personWithName:(NSString *)name
{
// 這是個延遲釋放的物件
Person *p = [[[Person alloc] init] autorelease];
p.name = name;
// 無法 return
// [p release];
return p;
// 無法 release
// [p release];
}
控制器中的使用
- 宣告屬性
@interface ViewController ()
/// p1
@property (nonatomic,weak) Person *p1;
/// p2
@property (nonatomic,weak) Person *p2;
@end
- Person類的例項化
- (void)viewDidLoad {
[super viewDidLoad];
self.p1 = [[Person alloc] init];
self.p1.name = @"zs";
NSLog(@"%@",self.p1.name);
self.p2 = [Person personWithName:@"ls"];
NSLog(@"%@",self.p2.name);
// 手動建立自動釋放池,這個不是我們討論的
@autoreleasepool {
}
}
- 測試物件的釋放
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
NSLog(@"%@",self.p1.name);
NSLog(@"%@",self.p2.name);
}
- 提問 :
p2
什麼時候釋放的? 自動釋放池銷燬的時候釋放的.- 自動釋放池什麼時候銷燬的?
- 自動釋放池什麼時候建立的?
執行迴圈和自動釋放池關係
- iOS開發中的記憶體管理
- 在iOS開發中,並沒有JAVA或C#中的垃圾回收機制
- 在MRC中物件誰申請,誰釋放
- 使用ARC開發,只是在編譯時,編譯器會根據程式碼結構自動新增了retain、release和autorelease.
-
自動釋放池
- 標記為autorelease的物件,會被新增到最近一次建立的自動釋放池中
- 當自動釋放池被銷燬或耗盡時,會向自動釋放池中的所有物件傳送release訊息
-
自動釋放池的建立與銷燬
- 此處討論的
自動釋放池
不是我們以前手動建立的那種.是系統處理記憶體相關的. - 自動釋放池是什麼時候建立的?什麼時候銷燬的?
- 建立 :
執行迴圈
檢測到事件並啟動後,就會建立自動釋放池. - 銷燬 : 一次完整的
執行迴圈
結束之前,會被銷燬.
- 建立 :
- 此處討論的
-
執行迴圈
- 執行迴圈 / 訊息迴圈.
- 作用
- 訊息迴圈保證應用程式不退出.
- 訊息迴圈在迴圈的撲捉訊息,然後執行訊息對應的操作.
執行迴圈和自動釋放池的關係圖解
-
什麼時候需要手動建立自動釋放池?
- 如果在迴圈中建立了大量的臨時變數的時候需要在迴圈一開始就手動建立一個自動釋放池
- If you write a loop that creates many temporary objects.You may use an autorelease pool block inside the loop to dispose of those objects before the next iteration. Using an autorelease pool block in the loop helps to reduce the maximum memory footprint of the application.
-
關於自動釋放池的筆試題
for (int i = 0; i < largeNumber; ++i) {
NSString *str = @"Hello World";
str = [str stringByAppendingFormat:@" - %d", i];
str = [str uppercaseString];
}
相關文章
- 重拾 ObjC 自動釋放池OBJ
- iOS開發 自動釋放池(Autorelease Pool)和RunLoopiOSOOP
- Runloop-執行迴圈OOP
- 淺談Javascript單執行緒和事件迴圈JavaScript執行緒事件
- JavaScript for迴圈 執行順序JavaScript
- Gil全域性解釋鎖和執行緒互斥鎖的關係執行緒
- 【關係抽取-R-BERT】定義訓練和驗證迴圈
- JavaScript如何中斷迴圈執行?JavaScript
- Casperjs迴圈執行(重複執行不退出)JS
- 執行緒和執行緒池執行緒
- 執行緒池相關執行緒
- 關於java執行緒釋放資源問題Java執行緒
- JavaScript for迴圈語句的執行順序和優化JavaScript優化
- 多執行緒迴圈控制欄位失效造成死迴圈的坑執行緒
- JavaScript執行機制-node事件迴圈JavaScript事件
- 【轉】Promise迴圈序列執行寫法Promise
- Java程式和執行緒關係及區別Java執行緒
- C#多執行緒學習(四) 多執行緒的自動管理(執行緒池)C#執行緒
- C# 多執行緒學習(4) :多執行緒的自動管理(執行緒池)C#執行緒
- 時間遞增迴圈執行指令碼指令碼
- (轉)Qt 的執行緒與事件迴圈QT執行緒事件
- 解決hibernate雙向關係造成的一方重複執行SQl,或者死迴圈的問題SQL
- 證明執行緒池ThreadPoolExecutor的核心執行緒數,最大執行緒數,佇列長度的關係執行緒thread佇列
- 執行緒池相關複習執行緒
- C# 迴圈時,操作另外一個程式直到操作完成,迴圈繼續執行C#
- Android的執行緒和執行緒池Android執行緒
- 執行緒池和Executor框架執行緒框架
- 多執行緒實現順序迴圈列印執行緒
- JavaScript 執行機制-瀏覽器事件迴圈JavaScript瀏覽器事件
- flutter: 執行緒通訊與訊息迴圈Flutter執行緒
- Java for迴圈中語句執行的順序Java
- 多執行緒 HashMap 死迴圈 問題解析執行緒HashMap
- java try(){}catch(){}自動資源釋放Java
- FireFox記憶體自動釋放Firefox記憶體
- 程式執行緒協程關係執行緒
- java自帶執行緒池和佇列詳細講解Java執行緒佇列
- 三個執行緒迴圈列印123-多執行緒執行緒
- 有關執行計劃,空間釋放的另一些