第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

使用塊保留`self`循環(huán)

使用塊保留`self`循環(huán)

函數(shù)式編程 2019-09-19 08:44:26
我擔(dān)心這個(gè)問(wèn)題非常基本,但我認(rèn)為這與很多進(jìn)入數(shù)據(jù)塊的Objective-C程序員有關(guān)。我聽(tīng)到的是,由于塊捕獲作為const副本在其中引用的局部變量self,因此如果要復(fù)制該塊,則在塊內(nèi)使用可能會(huì)導(dǎo)致保留周期。因此,我們應(yīng)該使用__block強(qiáng)制塊直接處理self而不是復(fù)制它。__block typeof(self) bself = self;[someObject messageWithBlock:^{ [bself doSomething]; }];而不僅僅是[someObject messageWithBlock:^{ [self doSomething]; }];我想知道的是:如果這是真的,有沒(méi)有辦法可以避免丑陋(除了使用GC)?
查看完整描述

3 回答

?
德瑪西亞99

TA貢獻(xiàn)1770條經(jīng)驗(yàn) 獲得超3個(gè)贊

嚴(yán)格來(lái)說(shuō),它是一個(gè)const副本的事實(shí)與這個(gè)問(wèn)題無(wú)關(guān)。塊將保留創(chuàng)建時(shí)捕獲的任何obj-c值。恰好,const-copy問(wèn)題的解決方法與保留問(wèn)題的解決方法相同; 即,使用__block變量的存儲(chǔ)類(lèi)。

無(wú)論如何,要回答你的問(wèn)題,這里沒(méi)有真正的選擇。如果你正在設(shè)計(jì)自己的基于塊的API,并且這樣做是有意義的,你可以讓塊self作為參數(shù)傳遞in 的值。不幸的是,這對(duì)大多數(shù)API來(lái)說(shuō)沒(méi)有意義。

請(qǐng)注意,引用ivar具有完全相同的問(wèn)題。如果您需要在塊中引用ivar,請(qǐng)使用屬性或使用bself->ivar


附錄:編譯為ARC時(shí),__block不再中斷保留周期。如果您正在為ARC編譯,則需要使用__weak__unsafe_unretained替代。


查看完整回答
反對(duì) 回復(fù) 2019-09-19
?
回首憶惘然

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超11個(gè)贊

這可能是顯而易見(jiàn)的,但是self當(dāng)你知道你會(huì)得到一個(gè)保留周期時(shí),你只需要做丑陋的別名。如果塊只是一次性的東西,那么我認(rèn)為你可以安全地忽略保留self。例如,當(dāng)您將塊作為回調(diào)接口時(shí),不好的情況就是如此。像這兒:

typedef void (^BufferCallback)(FullBuffer* buffer);@interface AudioProcessor : NSObject {…}@property(copy) BufferCallback bufferHandler;@end@implementation AudioProcessor- (id) init {
    …
    [self setBufferCallback:^(FullBuffer* buffer) {
        [self whatever];
    }];
    …}

這里的API沒(méi)有多大意義,但是在與超類(lèi)通信時(shí)也是有意義的。我們保留緩沖區(qū)處理程序,緩沖區(qū)處理程序保留了我們。比較這樣的事情:

typedef void (^Callback)(void);@interface VideoEncoder : NSObject {…}- (void) encodeVideoAndCall: (Callback) block;@end@interface Foo : NSObject {…}@property(retain) VideoEncoder *encoder;@end@implementation Foo- (void) somewhere {
    [encoder encodeVideoAndCall:^{
        [self doSomething];
    }];}

在這些情況下,我不做self別名。你確實(shí)得到一個(gè)保留周期,但是操作是短暫的,并且塊最終會(huì)從內(nèi)存中斷開(kāi),從而打破周期。但是我對(duì)塊的體驗(yàn)非常小self,從長(zhǎng)遠(yuǎn)來(lái)看,混疊可能是最佳實(shí)踐。


查看完整回答
反對(duì) 回復(fù) 2019-09-19
  • 3 回答
  • 0 關(guān)注
  • 574 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)