AutoReleasePool

AutoReleasePool

  • 此處討論的自動釋放池不是我們以前手動創(chuàng)建的那種.是系統處理內存相關的.

自動釋放池和運行循環(huán)關系

  • iOS開發(fā)中的內存管理
    • 在iOS開發(fā)中降狠,并沒有JAVA或C#中的垃圾回收機制
    • 在MRC中對象誰申請,誰釋放
    • 使用ARC開發(fā),只是在編譯時,編譯器會根據代碼結構自動添加了retain挥唠、release和autorelease.
  • 自動釋放池
    • 標記為autorelease的對象扩所,會被添加到最近一次創(chuàng)建的自動釋放池中
    • 當自動釋放池被銷毀或耗盡時嫉入,會向自動釋放池中的所有對象發(fā)送release消息

自動釋放池的創(chuàng)建與銷毀

  • 此處討論的自動釋放池不是我們以前手動創(chuàng)建的那種.是系統處理內存相關的.
  • 自動釋放池是什么時候創(chuàng)建的壁查?什么時候銷毀的?
    • 創(chuàng)建 : 運行循環(huán)檢測到事件并啟動后,就會創(chuàng)建自動釋放池.
    • 銷毀 : 一次完整的運行循環(huán)結束之前,會被銷毀.

運行循環(huán)

  • 運行循環(huán) / 消息循環(huán).
  • 作用
    • 消息循環(huán)保證應用程序不退出.
    • 消息循環(huán)在循環(huán)的撲捉消息,然后執(zhí)行消息對應的操作.
  • 模擬運行循環(huán)
int main(int argc, const char * argv[]) {
    @autoreleasepool {

        while (YES) {

            // 在控制臺打印提示語
            printf("請輸入你要做的操作:");

            // 保存輸入的數字
            int result;

            // 接收控制太輸入的數組字
            scanf("%d",&result);

            // 判斷控制臺輸入的數字
            if (0==result) {
                NSLog(@"退出程序");
                break;
            } else if (1==result) {
                NSLog(@"點擊了按鈕");
            } else if (2==result) {
                NSLog(@"滾動了視圖");
            }

            // insert code here...
//            NSLog(@"Hello, World!");
        }
    }
    return 0;
}

運行循環(huán)和自動釋放池的關系圖解

什么時候需要手動創(chuàng)建自動釋放池?

  1. 如果在循環(huán)中創(chuàng)建了大量的臨時變量的時候需要在循環(huán)一開始就手動創(chuàng)建一個自動釋放池

    • 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.
  2. 如果你生成一個子線程的時候,要在線程開始執(zhí)行的時候,盡快創(chuàng)建一個自動釋放池.否則會內存泄露.因為子線程無法訪問主線程的自動釋放池.

    • 自定義NSOperation和NSThread時
    • If you spawn a secondary thread.You must create your own autorelease pool block as soon as the thread begins executing; otherwise, your application will leak objects. (See Autorelease Pool Blocks and Threads for details.)
      
      

關于自動釋放池的筆試題

for (int i = 0; i < largeNumber; ++i) {
    NSString *str = @"Hello World";
    str = [str stringByAppendingFormat:@" - %d", i];
    str = [str uppercaseString];
}

// 問 : 以上代碼存在問題嗎?

延緩釋放的對象

演示延緩釋放的對象

  • 新建Person類,將Person類的編譯環(huán)境改成MRC的.
  • 手動管理Person類的內存.

Person類中聲明

@interface Person : NSObject

/// 名字
@property (nonatomic,copy) NSString *name;

/// 類方法實例化person對象
+ (instancetype)personWithName:(NSString *)name;

@end

Person類中實現

  • MRC開發(fā)中,所有返回id類型的類方法,都必須要使用autorelease標記成延緩釋放的對象.
  • 延遲釋放的對象,在出了作用域以后,會被添加到最近一次創(chuàng)建的自動釋放池中,等待被釋放.
+ (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);

    // 手動創(chuàng)建自動釋放池,這個不是我們討論的
    @autoreleasepool {

    }
}
  • 測試對象的釋放
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    NSLog(@"%@",self.p1.name);
    NSLog(@"%@",self.p2.name);
}
  • 提問 :
    1. p2 什么時候釋放的? 自動釋放池銷毀的時候釋放的.
    2. 自動釋放池什么時候銷毀的?
    3. 自動釋放池什么時候創(chuàng)建的?
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末剔应,一起剝皮案震驚了整個濱河市睡腿,隨后出現的幾起案子,更是在濱河造成了極大的恐慌峻贮,老刑警劉巖席怪,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異纤控,居然都是意外死亡挂捻,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門船万,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刻撒,“玉大人,你說我怎么就攤上這事耿导∩” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵舱呻,是天一觀的道長醋火。 經常有香客問我,道長,這世上最難降的妖魔是什么芥驳? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任柿冲,我火速辦了婚禮,結果婚禮上兆旬,老公的妹妹穿的比我還像新娘假抄。我一直安慰自己,他們只是感情好爵憎,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布慨亲。 她就那樣靜靜地躺著,像睡著了一般宝鼓。 火紅的嫁衣襯著肌膚如雪刑棵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天愚铡,我揣著相機與錄音蛉签,去河邊找鬼。 笑死沥寥,一個胖子當著我的面吹牛碍舍,可吹牛的內容都是我干的。 我是一名探鬼主播邑雅,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼片橡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了淮野?” 一聲冷哼從身側響起捧书,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎骤星,沒想到半個月后经瓷,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡洞难,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年舆吮,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片队贱。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡色冀,死狀恐怖,靈堂內的尸體忽然破棺而出柱嫌,到底是詐尸還是另有隱情呐伞,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布慎式,位于F島的核電站伶氢,受9級特大地震影響趟径,放射性物質發(fā)生泄漏。R本人自食惡果不足惜癣防,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一蜗巧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蕾盯,春花似錦幕屹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挫鸽,卻和暖如春说敏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丢郊。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工盔沫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人枫匾。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓架诞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親干茉。 傳聞我的和親對象是個殘疾皇子谴忧,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內容