代码之家  ›  专栏  ›  技术社区  ›  elcool codeVerine

释放一个对象但仍能使用它

  •  0
  • elcool codeVerine  · 技术社区  · 14 年前

    我知道一旦你释放了一个对象,你就不应该使用它,因为它将导致一个错误,因为它已经不在内存中了。

    this 苹果指南,我发现了这个代码,以前也见过,但我会移动 [object release] 直到我的代码结束,以免出错。但它似乎是被接受的,而且是有效的。那么,为什么这样做?它如何将变量设置为 dateAttribute 在它被释放之后?

    NSMutableArray *runProperties = [NSMutableArray array];
    
    NSAttributeDescription *dateAttribute = [[NSAttributeDescription alloc] init];
    [runProperties addObject:dateAttribute];
    [dateAttribute release];
    [dateAttribute setName:@"date"];
    [dateAttribute setAttributeType:NSDateAttributeType];
    [dateAttribute setOptional:NO];
    

    从这里得到: Creating a managed object model in code

    2 回复  |  直到 14 年前
        1
  •  2
  •   bbum    14 年前

    我们应该讨论几点。

    1. release 始终使对象解除分配。对象将仅在“最后”版本释放,即当retain count降为零时释放。
    2. 尽管如此,在释放对象之后不应该使用它仍然是正确的,因为它是 可能的 可能已经被释放了。
    3. 这个 NSMutableArray

    retain 添加时的引用,因此在释放后该引用将不会被释放 dateAttribute . 然而,这不是一个好的风格,因为它的有效性仅仅取决于类的性质 它本身,并且它打破了我们不应该使用已发布引用的常见规则。

        2
  •  1
  •   Yann Ramin    14 年前

    从技术上讲,这是一种糟糕的风格,但它确实有效。

    NSMutableArray(runProperties addObject)调用 retain 在date属性上。因此,调用release不会破坏dateAttribute(仍然有一个引用)。

    release 最后的 .