3 回答

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)的做法是一直不停地檢查零。

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ò)了。

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)用程序崩潰并處理后果。
添加回答
舉報(bào)