[Objective-C] 释放对象时在release之后要设成nil

参考:

http://stackoverflow.com/questions/3072003/why-set-object-to-nil-after-sending-release-message-in-obj-c

http://cocoadevcentral.com/d/learn_objectivec/

http://stackoverflow.com/questions/1670876/objective-c-iphone-when-to-set-object-references-to-nil


常看到下面的写法,在想要释放一个object的地方,先release这个object,紧接着将它赋值成nil

[some_obj release], some_obj = nil;
执行 some_obj = nil 的原因在于:

对一个object做了release之后,这个object的引用计数会立即减1,但这个object并不一定就立即被free了。直到其引用计数变成0的时候,它才可能真正被free掉(即使在这种情况下,也未必是立即free,object会被放到一个autorelease的pool中,在适当的时机才真正被free掉)

如果some_obj已经被执行了release,但没有被置nil,这时some_obj指针仍然指向该object。如果在“object被release“之后,“object真正被free掉”之前,我们执行了[some_obj some_method] 是可以的,但如果在“object真正被free掉”之后再执行[some_obj some_method] 就不好了。

在[some_obj release]之后紧接着执行 some_obj = nil 可以使得[some_obj some_method] 无效,从而安全。


注:


1)根据 http://cocoadevcentral.com/d/learn_objectivec/ 第10节《Calling Methods on Nil》的介绍,Object C中的nil类似C++中的NULL,不同之处在于:

  • C++中一般会像这样,先判断指针是否为空,如果不为空才通过指针执行方法,以防止crash。

MyClass * p = NULL;
if (p != NULL) {
	p->SomeMethod();
}

  • 而Object C中,对nil的指针是可以直接执行方法的,不会crash,不会抛异常,同时,方法不会真正被执行。如果方法的返回值是一个object,则对nil执行方法,会得到一个nil的返回值。简言之,messages to nil are ignored

2)对nil执行方法是安全的。对指向已经free了的对象但未置nil的指针(即”野指针“)执行方法,执行方法是不安全的,该”野指针“指向一块内存区域,这块内存区域先前未一个object分配但现已释放,再在此内存区域尝试执行对象的方法是不可能的,会报error的。

3)简单的 some_obj = nil只是将指针置空,而不会释放内存,会造成内存泄露。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值