释放对象时的正确顺序是什么?

时间:2011-08-13 05:58:08

标签: objective-c

我学会了一种释放像这样的物体的方法。

NSMutableString *string1 = [[NSMutableString alloc]initWithFormat:@"ABCDEF"];
 :
progress some code.
 :
string1 = nil;
[string1 release];

问题如下。

string1 = nil; < =通过分配nil来丢失string1指针。

然后,[string1 release]; < =可以向string1接收者发送消息吗?

  1. string1 = nil;

    [string1 release];

  2. [string1 release];

    string1 = nil;

    什么是正确的序列?

    [补充问题..]

    是否可以在自定义方法中声明对象的@property(NSString,NSNumner,NSARRAY ...)?

3 个答案:

答案 0 :(得分:3)

这实际上并没有完成你想要做的事情。它似乎只能工作,因为Objective C允许您向nil对象指针发送消息。在你的例子中你是正确的,你丢失了指向已分配内存的指针,因此,保持未释放。

执行此操作的正确方法是在字符串上调用release,然后将其设置为nil(在示例中为第二个场景)。


顺便说一句,请注意,如果 string1 是带有retain关键字的类属性,那么您可以执行以下操作:

self.string1 = nil;

这实际上会释放变量。这依赖于与合成相关的实现细节,因此您不必担心它:您的原始问题。只是一个有趣的旁注。

答案 1 :(得分:2)

你的#2是正确的顺序。首先释放您分配的对象,然后将指针设置为nil以防止随后对其执行任何其他操作(现在不可靠的地址)。

在#1中,一旦你设置了一个指向nil的指针,它就不再指向实际的对象,所以在(nil)指针上调用release不会导致错误,但不会做任何事。

答案 2 :(得分:0)

关于Perception解释的一些额外信息。合成的setter生成的代码看起来有点像(@property (nonatomic, copy) NSString *string):

- (void)setString:(NSString *)newString
{
   if ([string isEqualToString:newString]) return;

   [string autorelease];
   string = [newString copy];
}

现在,当字符串具有当前值test而newString具有值nil时,则该字符串将被释放并且不会发生任何复制,因为copy消息将被发送到nil。这就是self.string = nil正确释放字符串同时将其指针设置为nil的原因。