【问题标题】:What is correct sequence when release object?释放对象时的正确顺序是什么?
【发布时间】:2011-08-13 05:58:07
【问题描述】:

我学会了一种像这样释放对象的方法。

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

问题如下。

string1 = nil;

然后,[string1 release];

  1. string1 = nil;

    [string1 释放];

  2. [string1 释放];

    string1 = nil;

    什么是正确的顺序?

    [补充问题..]

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

【问题讨论】:

    标签: objective-c


    【解决方案1】:

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

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


    顺便说一句,如果 string1 是一个带有 retain 关键字的类属性,那么你可以这样做:

    self.string1 = nil;
    

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

        • 是否可以在自定义方法中声明@property of object(NSString, NSNumner, NSARRAY...)?
        • 我猜你想知道你是否可以覆盖合成方法(getter / setter)?是的,你可以。
        猜你喜欢
        • 1970-01-01
        • 2011-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-18
        • 2023-03-25
        • 1970-01-01
        相关资源
        最近更新 更多