今天用一段代码来验证一下正确的property赋值方式
图中被圈出来的两种方式,更为推荐的当然是第二种。
那么第一种有什么问题呢?运行一下你就知道了。
是不是crash了,报错“pointer being freed was not allocated”。
为什么会出错呢,表面看上去所有的“alloc”、“release”使用都没问题啊。
请看最下面注射掉的代码,是不是豁然开朗。
在执行self.a = c这句时,需要先release掉_a之前的值,也就是b。可是b此时已经被release过了且retainCount为0,如何再release一次呢。这都是因为第一次的赋值是用的_a = b,而如果正常用self.a = b赋值的话,b是先被retain过的,就不会出现这个问题。
当然以上所说前提都是在MRC下,常见于老代码,那些早年刚从其他语言转来OC的coder们经常习惯这种写法。所以在改别人的代码或者自己写的时候就要注意了,尽量用规范的方式,以减少之后debug的麻烦。规范不就是用来提高效率的嘛。