假设我有一个实例变量 MyObject* 测试;
@property(nonatomic, retain) MyObject* test;
.m
@synthesize test;
我可能会初始化它,或者现在可能取决于我是否需要。如果我不需要它,就没有必要浪费初始化。
问题在dealloc中,进行下面的检查和释放是否安全?
-(void) dealloc
{
if ( test != nil )
{
[test release];
}
{
谢谢!
是的,它是安全的。但是,发送release到 nil 不会造成任何问题,因此您无需检查。
你不需要这样做。如果您将自动释放的对象分配给ivar ,您可以简单地执行此操作:
self.test = nil;
编辑:
不要忘记在dealloc函数[super dealloc]结束时调用
这是安全的,但不是标准做法。您可以安全地向 nil 引用发送消息,这是惯用 Objective-C 编写方式的重要组成部分。只需释放 ivar:
- (void)dealloc
{
[test release];
// ...
这很好。简单地省略nil.
在幕后,编译器(通常*)生成objc_msgSend对其变体或其变体之一的调用。(和变体)的实现objc_msgSend允许您消息的对象是nil,从某种意义上说,它定义良好并且不被认为是程序员的错误消息nil。objc_msgSend+ 变体的返回值归零:
例子:
NSString * string = nil;
NSString * copy = [string copy]; << copy will be 0/nil
NSUInteger length = [copy length]; << length will be 0
这意味着如果返回 c++ 对象,您必须测试 nil ——如果接收者为 nil,则不会调用构造函数。
*通常,从某种意义上说,编译器调用了一些 c 函数来执行消息传递以及其他一些常见例程。