__autoreleasing 如何做到延遲釋放的汇竭?

1.__autoreleasing 是什么?

__autoreleasing 是oc中的一個(gè)與內(nèi)存管理相關(guān)的變量修飾符

2.__autoreleasing 能做什么忍些?

用__autoreleasing修飾的變量會(huì)自動(dòng)被添加至自動(dòng)緩存池(@autoreleasepool)

__autoreleasing修飾的變量的生命周期不再受當(dāng)前函數(shù)作用域影響檀头,轉(zhuǎn)而被自動(dòng)緩存池影響轰异,因此用__autoreleasing修飾變量可延長(zhǎng)變量的生命周期

@property(nonatomic,weak)NSObject *weakObj1;
@property(nonatomic,weak)NSObject *weakObj2;


- (void)test {
     NSLog(@"--1---%@--%@",self.weakObj1,self.weakObj2);
     [self test2];
     NSLog(@"--3---%@--%@",self.weakObj1,self.weakObj2);
 }


- (void)test2 {
     __autoreleasing NSObject *obj1 = [NSObject new];
     NSObject *obj2 = [NSObject new];
     self.weakObj1 = obj1;
     self.weakObj2 = obj2;
     NSLog(@"--2---%@--%@",self.weakObj1,self.weakObj2);
 }

控制臺(tái)輸出:

2020-03-18 20:33:29. [20030:716861] --1---(null)--(null)
2020-03-18 20:33:51. [20030:716861] --2---<NSObject: 0x600003d28390>--<NSObject: 0x600003d283a0>
2020-03-18 20:33:51. [20030:716861] --3---<NSObject: 0x600003d28390>--(null)

3.__autoreleasing 怎么做到的?

添加至自動(dòng)緩存池的變量會(huì)在緩存池結(jié)束的時(shí)候收到一次 release暑始,但是怎么做到擺脫當(dāng)前函數(shù)作用域影響的搭独?

- (void)test2 {
    
    __autoreleasing NSObject *obj1 = [NSObject new];

    NSObject *obj2 = [NSObject new];  

}

編譯成匯編如下:

Giftfff`-[Oobj test2]:
    0x103e61140 <+0>:   pushq  %rbp
    0x103e61141 <+1>:   movq   %rsp, %rbp
    0x103e61144 <+4>:   subq   $0x30, %rsp
    0x103e61148 <+8>:   movq   %rdi, -0x8(%rbp)
    0x103e6114c <+12>:  movq   %rsi, -0x10(%rbp)
    0x103e61150 <+16>:  movq   0x245a59(%rip), %rsi      ; (void *)0x00007fff89e066c0: NSObject
    0x103e61157 <+23>:  movq   0x245162(%rip), %rdi      ; "new"
    0x103e6115e <+30>:  movq   %rdi, -0x28(%rbp)
    0x103e61162 <+34>:  movq   %rsi, %rdi
    0x103e61165 <+37>:  movq   -0x28(%rbp), %rsi
    0x103e61169 <+41>:  callq  *0x22ac21(%rip)           ; (void *)0x00007fff513f7780: objc_msgSend
    0x103e6116f <+47>:  movq   %rax, %rdi
    0x103e61172 <+50>:  callq  0x10405861a               ; symbol stub for: objc_autorelease
    0x103e61177 <+55>:  movq   %rax, -0x18(%rbp)
->  0x103e6117b <+59>:  movq   0x245a2e(%rip), %rax      ; (void *)0x00007fff89e066c0: NSObject
    0x103e61182 <+66>:  movq   0x245137(%rip), %rsi      ; "new"
    0x103e61189 <+73>:  movq   %rax, %rdi
    0x103e6118c <+76>:  callq  *0x22abfe(%rip)           ; (void *)0x00007fff513f7780: objc_msgSend
    0x103e61192 <+82>:  xorl   %ecx, %ecx
    0x103e61194 <+84>:  movl   %ecx, %esi
    0x103e61196 <+86>:  movq   %rax, -0x20(%rbp)
    0x103e6119a <+90>:  leaq   -0x20(%rbp), %rax
    0x103e6119e <+94>:  movq   %rax, %rdi
    0x103e611a1 <+97>:  callq  0x104058680               ; symbol stub for: objc_storeStrong
    0x103e611a6 <+102>: addq   $0x30, %rsp
    0x103e611aa <+106>: popq   %rbp
    0x103e611ab <+107>: retq   

將匯編再翻譯成偽代碼:

- (void)test2{
    
   // __autoreleasing NSObject *obj1 = [NSObject new]; 等同于:
    id obj1 = objc_msgSend(NSObject, @selector(new));
    objc_autorelease(obj1);
    
   // NSObject *obj2 = [NSObject new]; 等同于:
    id obj2 = objc_msgSend(NSObject, @selector(new));
    defer {
       objc_storeStrong(&obj2,nil)
    }   
}

其中 objc_autorelease(obj1) 即是將obj1添加至自動(dòng)緩存池

objc_storeStrong 則如下:

void objc_storeStrong(id *location, id obj)
{
    id prev = *location;
    if (obj == prev) {
        return;
    }
    objc_retain(obj);
    *location = obj;
    objc_release(prev);
}

obj1 在被__autoreleasing修飾后被加入至自動(dòng)緩存池,并且在函數(shù)結(jié)束時(shí)不會(huì)再調(diào)用objc_storeStrong廊镜,因此擺脫函數(shù)作用域?qū)λ纳芷诘挠绊憽?/p>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末牙肝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嗤朴,更是在濱河造成了極大的恐慌配椭,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雹姊,死亡現(xiàn)場(chǎng)離奇詭異股缸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)容为,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門乓序,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)寺酪,“玉大人坎背,你說(shuō)我怎么就攤上這事〖娜福” “怎么了得滤?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)盒犹。 經(jīng)常有香客問我懂更,道長(zhǎng),這世上最難降的妖魔是什么急膀? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任沮协,我火速辦了婚禮,結(jié)果婚禮上卓嫂,老公的妹妹穿的比我還像新娘慷暂。我一直安慰自己,他們只是感情好晨雳,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布行瑞。 她就那樣靜靜地躺著奸腺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪血久。 梳的紋絲不亂的頭發(fā)上突照,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音氧吐,去河邊找鬼讹蘑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛副砍,可吹牛的內(nèi)容都是我干的衔肢。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼豁翎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼角骤!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起心剥,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤邦尊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后优烧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝉揍,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年畦娄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了又沾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡熙卡,死狀恐怖杖刷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情驳癌,我是刑警寧澤滑燃,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站颓鲜,受9級(jí)特大地震影響表窘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜甜滨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一乐严、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧衣摩,春花似錦昂验、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)黍匾。三九已至,卻和暖如春呛梆,著一層夾襖步出監(jiān)牢的瞬間锐涯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工填物, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纹腌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓滞磺,卻偏偏與公主長(zhǎng)得像升薯,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子击困,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容