自動釋放池
自動釋放池塊
自動釋放池是允許你放棄對一個物件的持有關係,但可以避免它立即被回收的一個工具,當從方法返回你的物件的時候,這個功能很有用。
- 將建立的物件存入到自動釋放池中,不需要手動的區release 物件了
- 在池子銷燬的時候,就會自動呼叫池子中所有的release
1 程式的入口處於在main 函式
這就意味著整個應用都在自動釋放池中,所有的物件最後都會被回收。
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
2 autoreleasepool 使用的場景
Cocoa 框架希望程式碼能在 自動釋放池中執行,否則物件將無法被釋放,導致應用發生記憶體洩露。
AppKit 和 UIKit 框架 迴圈的迭代放入自動釋放池中,我們不需要建立自動釋放池。
- 場景1 當有一個建立了很多臨時物件的迴圈時,使用自動釋放池釋放掉臨時記憶體
for (int i = 0; i < 10000; i ++) {
// 使用自動釋放池釋放掉臨時記憶體
@autoreleasepool{
Person *p = [[Person alloc]init];
p.name = @"1213";
p.age = i;
}
}
- 場景2 當你自己建立一個執行緒開啟任務的時候,每一個執行緒都有自己的autorelease 塊棧,主執行緒的自動釋放池預設開啟,自定義的執行緒必須手動開啟。
NSThread *thred = [[NSThread alloc]initWithTarget:self selector:@selector(countStart) object:nil];
[thred start];
- (void)countStart
{
// 新的執行緒的程式碼
@autoreleasepool{
for (int i = 0; i < 10000; i ++) {
// 使用自動釋放池釋放掉臨時記憶體
@autoreleasepool{
Person *p = [[Person alloc]init];
p.name = @"1213";
p.age = i;
}
}
}
}
自動釋放池使用注意點
- 自動釋放池可以進行巢狀使用
- 如果把一個物件重複載入到自動釋放池中,就會出現野指標。
// 建立1個物件
Person *p1 = [[Person alloc]init];
p1.name = @"Alexander";
//
@autoreleasepool
{
// p1 載入進入自動釋放池
[p1 autorelease];
@autoreleasepool
{
// 重複載入進來 仍然是第一個
[p1 autorelease];
}
}// 程式碼執行到此處 p1 自動被釋放,兩個都被釋放 出現野指標
相關文章
- 重拾 ObjC 自動釋放池OBJ
- java try(){}catch(){}自動資源釋放Java
- Java 自動釋放鎖的幾種實現Java
- win10如何設定自動釋放記憶體_win10怎麼設定自動清理系統垃圾釋放記憶體Win10記憶體
- Ftrans檔案自動化傳輸方案:釋放雙手,讓資料流動更自由!
- 寧德時代:2019年淨利潤超45億元 動力電池產能逐漸釋放
- 如何主動釋放 HeapIdle 的記憶體API記憶體
- Linux如何手動釋放Swap、Buffer和CacheLinux
- c#使用using關鍵字自動釋放資源不一定有好處C#
- 教你如何進行Prometheus 分片自動縮放Prometheus
- Web移動端 自適應縮放介面Web
- iOS自動整合打包釋出iOS
- 手動釋放Linux上的Swap、Buffer和CacheLinux
- linux 釋放埠Linux
- linux埠釋放Linux
- 釋放ip埠
- AI獨角獸依圖釋出開放計劃,清華、自動化所、中移動等已“進群”AI
- C/C++ 實現動態資原始檔釋放C++
- Linux系統手動釋放記憶體快取Linux記憶體快取
- 怎麼手動在rstudio中釋放記憶體?記憶體
- jenkins自動釋出java程式碼JenkinsJava
- appuploader iOS 應用自動釋出APPiOS
- 利用 GitHub Action 自動釋出 DockerGithubDocker
- centos 釋放內容CentOS
- 電腦主機板電池怎麼放電?常用的電腦主機板電池放電方法
- Oracle資料庫高水位釋放——LOB欄位空間釋放Oracle資料庫
- 如何釋放Mac空間?釋放Mac系統空間小技巧Mac
- 前端自動化:Node 命令列前端自動構建釋出系統前端命令列
- Capistrano 3.11, GitLab, PHP 本地自動釋出APIGitlabPHP
- ReactNative專案自動化打包釋出React
- vscode自動註釋外掛的使用VSCode
- GitLab整合kubernetes實現自動釋出Gitlab
- [譯] 使用 Travis CI 自動釋出 npmNPM
- 電池 並聯、串聯、充電、放電
- 中比新能源將舉辦企業開放日,釋出高效能鈉離子電池
- KEDA將事件驅動的自動縮放功能引入Kubernetes -新堆疊事件
- 基於DotNetty實現自動釋出 - 自動檢測程式碼變化Netty
- XCode釋放記憶體XCode記憶體