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

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

在Objective-C中,為什么要檢查self = [super init]是否不為零?

在Objective-C中,為什么要檢查self = [super init]是否不為零?

牛魔王的故事 2019-12-11 10:09:13
我有一個(gè)關(guān)于在Objective-C中編寫(xiě)init方法的一般問(wèn)題。我到處都看到(Apple的代碼,書(shū)籍,開(kāi)放源代碼等),init方法應(yīng)該在繼續(xù)進(jìn)行初始化之前檢查self = [super init]是否不為零。初始化方法的默認(rèn)Apple模板是:- (id) init{    self = [super init];    if (self != nil)    {        // your code here    }    return self;}為什么?我的意思是init什么時(shí)候會(huì)返回nil?如果我在NSObject上調(diào)用init并返回nil,那么一定要搞砸了,對(duì)吧?在這種情況下,您甚至可能根本不編寫(xiě)程序...類(lèi)的init方法返回nil真的很常見(jiàn)嗎?如果是這樣,在什么情況下,為什么?
查看完整描述

3 回答

?
qq_笑_17

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

例如:


[[NSData alloc] initWithContentsOfFile:@"this/path/doesn't/exist/"];

[[NSImage alloc] initWithContentsOfFile:@"unsupportedFormat.sjt"];

[NSImage imageNamed:@"AnImageThatIsntInTheImageCache"];

... 等等。(注意:如果文件不存在,NSData可能會(huì)引發(fā)異常)。在很多地方,出現(xiàn)問(wèn)題時(shí)返回零是預(yù)期的行為,因此,出于一致性的考慮,標(biāo)準(zhǔn)的做法是一直不停地檢查零。



查看完整回答
反對(duì) 回復(fù) 2019-12-12
?
嗶嗶one

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

這個(gè)特殊的習(xí)慣用法是標(biāo)準(zhǔn)的,因?yàn)樗m用于所有情況。


雖然不常見(jiàn),但在某些情況下...


[super init];

...返回一個(gè)不同的實(shí)例,因此需要分配給self。


在某些情況下,它將返回nil,因此需要執(zhí)行nil檢查,以便您的代碼不會(huì)嘗試初始化不再存在的實(shí)例變量插槽。


底線是使用的已記錄的正確模式,如果不使用它,那就錯(cuò)了。



查看完整回答
反對(duì) 回復(fù) 2019-12-12
?
神不在的星期二

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

我認(rèn)為,在大多數(shù)類(lèi)中,如果[super init]的返回值是nil,并且按照標(biāo)準(zhǔn)做法的建議進(jìn)行檢查,然后過(guò)早返回(如果是nil),則基本上您的應(yīng)用仍無(wú)法正常工作。如果您考慮一下,即使那里(self!= nil)檢查存在,為了使您的班級(jí)正常運(yùn)行,您實(shí)際上確實(shí)有99.99%的時(shí)間需要self不為nil?,F(xiàn)在,假設(shè),由于任何原因,[super init] 確實(shí)返回了nil,基本上您對(duì)nil的檢查基本上是將buck傳遞給了您的類(lèi)的調(diào)用者,無(wú)論如何它都可能失敗,因?yàn)樗匀粫?huì)假定調(diào)用為成功。

基本上,我得到的是99.99%的時(shí)間,if(self!= nil)不會(huì)給您帶來(lái)任何更大的健壯性,因?yàn)槟皇菍⒇?zé)任推給了調(diào)用者。為了真正能夠可靠地處理此問(wèn)題,實(shí)際上需要在整個(gè)調(diào)用層次結(jié)構(gòu)中進(jìn)行檢查。即便如此,它唯一能買(mǎi)到的是您的應(yīng)用程序?qū)⒏痈蓛?健壯地失敗。但是它仍然會(huì)失敗。

如果某個(gè)庫(kù)類(lèi)由于[super init]的結(jié)果而任意決定返回nil,那么您無(wú)論如何都會(huì)感到煩惱,這更多地表明該庫(kù)類(lèi)的編寫(xiě)者犯了一個(gè)實(shí)現(xiàn)錯(cuò)誤。

我認(rèn)為當(dāng)應(yīng)用程序在有限得多的內(nèi)存中運(yùn)行時(shí),這更像是一種傳統(tǒng)的編碼建議。

但是對(duì)于C級(jí)代碼,我通常仍將對(duì)照NULL指針檢查malloc()的返回值。而對(duì)于Objective-C,直到我發(fā)現(xiàn)相反的證據(jù),我認(rèn)為我通常會(huì)跳過(guò)if(self!= nil)檢查。為什么會(huì)有差異?

因?yàn)樵贑和malloc級(jí)別上,您實(shí)際上實(shí)際上可以部分恢復(fù)。我認(rèn)為在Objective-C中,在99.99%的情況下,如果[super init]確實(shí)返回nil,即使您嘗試處理它,也基本上會(huì)感到滿(mǎn)意。您不妨讓?xiě)?yīng)用程序崩潰并處理后果。



查看完整回答
反對(duì) 回復(fù) 2019-12-12
  • 3 回答
  • 0 關(guān)注
  • 295 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(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)