天天看點

iOS Autorelease Pool (自動釋放池)

####我們都知道在記憶體管理中有2種釋放記憶體,一種是[ objc release] 直接釋放 還有一種是 [objc autorelease].當對象調用autorelease時,會将對象加入自動釋放池中。自動釋放池會在将來的某一時刻将存在池中的對象釋放掉。清空自動釋放時,系統會向其中的對象發送release消息。

我們知道自動釋放池就是把其作用域裡調用autorelease的對象存放的地方,在将來的某一時刻将存在池中的對象釋放掉。那麼他有什麼作用呢?

一般不用我們建立自動釋放池,主線程和gcd預設都有自動釋放池。

用于容納UIApplicationMain函數所自動釋放的那些對象
int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}
複制代碼
           

####1.降低記憶體峰值

NSMutableArray *array = [[NSMutableArray alloc] init];
    for (int i = 0; i < 10000; i++) {
        
        NSString *str = [NSString stringWithFormat:@"123"];
        [array addObject:str];
    }
複制代碼
           

上述代碼裡的str臨時變量 arc會幫我們自動釋放池中,等下時機釋放。但我們在短時間内往裡面加入太多,會導緻記憶體猛增.是以我們可以這樣

NSMutableArray *array = [[NSMutableArray alloc] init];
    for (int i = 0; i < 10000; i++) {
        
        @autoreleasepool {
         
            NSString *str = [NSString stringWithFormat:@"123"];
            [array addObject:str];
        }
    }
複制代碼
           

這樣寫str放入我們新建立的自動釋放池中,當走到塊末尾,會清空池中的對象,降低記憶體峰值。當然一般隻要不是消耗太大,不建議這樣寫,畢竟建立自動釋放池也是有消耗的

轉載于:https://juejin.im/post/5a31f19f6fb9a044fd11c73e

繼續閱讀