今天用一段代碼來(lái)驗(yàn)證一下正確的property賦值方式
圖中被圈出來(lái)的兩種方式,更為推薦的當(dāng)然是第二種。
那么第一種有什么問(wèn)題呢?運(yùn)行一下你就知道了。
是不是crash了,報(bào)錯(cuò)“pointer being freed was not allocated”。
為什么會(huì)出錯(cuò)呢,表面看上去所有的“alloc”、“release”使用都沒(méi)問(wèn)題啊。
請(qǐng)看最下面注射掉的代碼,是不是豁然開(kāi)朗。
在執(zhí)行self.a = c這句時(shí),需要先release掉_a之前的值,也就是b。可是b此時(shí)已經(jīng)被release過(guò)了且retainCount為0,如何再release一次呢。這都是因?yàn)榈谝淮蔚馁x值是用的_a = b,而如果正常用self.a = b賦值的話,b是先被retain過(guò)的,就不會(huì)出現(xiàn)這個(gè)問(wèn)題。
當(dāng)然以上所說(shuō)前提都是在MRC下,常見(jiàn)于老代碼,那些早年剛從其他語(yǔ)言轉(zhuǎn)來(lái)OC的coder們經(jīng)常習(xí)慣這種寫(xiě)法。所以在改別人的代碼或者自己寫(xiě)的時(shí)候就要注意了,盡量用規(guī)范的方式,以減少之后debug的麻煩。規(guī)范不就是用來(lái)提高效率的嘛。