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