2009-10-01 52 views
7

如果在创建对象时创建了一个包含两个对象指针的新对象(请参见下文),则指针设置为指向零;好的,释放一个指针,它是否?

@interface rocketShip : NSObject { 
    NSString *name; 
    NSNumber *thrust; 
} 

如果(由于某种意外原因)我不分配这些指针,后来释放他们在我的dealloc方法是好的,我敢肯定它,只是想检查?

- (void)dealloc{ 
    [name release]; 
    name = nil; 
    [thrust release]; 
    thrust = nil; 
    [super dealloc]; 
} 

加里

+2

记得在'dealloc'实现结束时调用'[super dealloc]'。 – Jason 2009-10-01 12:53:48

+0

对不起杰森,我确实知道,但不知何故,它在切割和粘贴中迷失了方向。 – fuzzygoat 2009-10-01 13:43:03

回答

22

发送消息到零将不会导致错误,所以这是好的。你需要确保指针实际上是零 - 发送消息到垃圾指针可能会导致错误。

7

是的,你可以这样做,因为你可以安全地发送一条消息(如release)到nil,它什么都不会做。

1

如果使用访问属性来创建你的get/set方法:

@interface rocketShip : NSObject { 
    NSString *name; 
    NSNumber *thrust; 
} 

@property (retain, nonatomic) NSString *name; 
@property (retain, nonatomic) NSNumber *thrust; 

而在你的.m文件:

@synthesize name; 
@synthesize thrust; 

然后,您可以只是你的变量设置为零的dealloc中。这实际上会调用您的setter并将引用计数减1并清理干净。

+0

文森特,这是一个很好的观点,我现在只是阅读@property&@synthesize。我只是想在我更加朝Objective-C 2.0 – fuzzygoat 2009-10-01 13:45:47

+1

的方向努力争取老派。作为一个澄清,你必须在dealloc中编写self.name = nil。除了GC以外,简单设置name = nil将是泄漏。 – sbooth 2009-10-01 14:28:32

+3

虽然它可以在最简单的情况下工作,但文森特的建议并不是最佳实践。在dealloc方法中使用'self.name = nil'会调用你的setter方法。如果一个子类(或者你)覆盖了这个setter方法,使得它有副作用或者取决于实例状态,那么当从dealloc中调用实例状态没有确定时,它可能会中断。调用[名称发布]可能会更好。 – 2009-10-01 16:29:22

0

在Objective-C中区分对象和变量很重要。你不能释放一个指针(一个变量的值),你只能释放一个对象(指针指向的对象)。零指针指的是没有对象,所以发送给nil的消息什么都不做(这通常是安全的)。