释放对象但仍能使用它

时间:2010-11-06 05:18:41

标签: iphone ios release-management

我已经明白,一旦你释放一个对象,就不应该使用它,因为它会导致错误,因为它不再存在于内存中。

但是通过this Apple指南阅读,我发现了这段代码,并且之前也看到了它,但我只是将[object release]移到代码的末尾,以避免得到错误。但它似乎被接受并且有效。那么,为什么这有效呢?如何在变量发布后将变量设置为dateAttribute

(第3行是有问题的一个):

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 个答案:

答案 0 :(得分:2)

我们应该讨论几点。

  1. release 总是使对象取消分配。该对象将仅在“最后”释放时解除分配,即当保留计数降至零时。
  2. 尽管如此,在释放它之后你仍然不应该使用该对象,因为它可能可能它已经被解除分配。
  3. NSMutableArray将保留对象,直到将其从数组中删除,或者分配数组本身。
  4. 该示例的优点是数组在添加时将retain引用,因此在释放dateAttribute之后,引用将不会被释放。但是,这不是一个好的风格,因为它的有效性完全取决于类NSMutableArray本身的性质,它打破了我们不应该使用已发布引用的常见规则。

答案 1 :(得分:1)

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

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

出于可读性和重构原因,我还会将调用发送到release 最后