nil和release区别困扰了我好久,测试多次并看看网上的解释,做个总结:
self.p=nil 和[p release]都可以释放内存自不必详细说明,因为属性在赋值的时候是调用set方法,里面封装了release消息。问题就在多出的部分,p被重新赋值为nil。nil据我观察,好像就是一个特定的地址(不知道到我理解是否正确,如果有哪位高手知道具体情况,请赐教呀!!!以及指向哪?应该是空地址,指向0内存),具体是哪我也不是很清楚。这样做的目的只是为内存安全着想的,因为如果你把对象release了,但它可能随机读取其它数据(应该是本对象引用仍然指向此地址,而此地址可能被其它数据所使用),而重新赋值为nil便没有这个问题,nil就是NULL的define。nil有个好处就是,无论你发送任何消息它都不会响应,也就不会异常了。这时候我们有时在类中声明的成员变量,有时并未进行初始化(默认值为nil,但没分配内存空间),这时我们仍然在dealloc方法中进行release也不会异常的,nil的retainCount始终为0,因此你可以无限次进行release。但是如果你进行初始化后则release完后(retainCount==0),倘若再release则产生异常,原因刚才说了,objective-c只为retainCount==0且值为nil不进行处理(nil对所有消息不响应,即可以对nil调用方法,而不致导致程序崩溃或抛出异常),换句话说,当你将对象release后,你的对象并不是nil,我的理解是你仍然指向源地址,虽然此内存并不存在(不过此时它仍然对消息响应,如果不识别则异常)。另外需要提及网上别人提的注意点,有时我们打印已release完毕的对象retainCount时会显示1,而不是预期的0(即异常),因为此时我们虽然最后一次(指预期将调用dealloc的)发出了release消息,但内存并不是立即释放,此时你仍然可以访问,直到系统某时刻释放它。这时候你可以在之前进行一些NSLog等操作,让系统有时间去释放,一切按计划进行。
···
···