我已经明白,一旦你释放一个对象,就不应该使用它,因为它会导致错误,因为它不再存在于内存中。
但是通过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];
答案 0 :(得分:2)
我们应该讨论几点。
release
不总是使对象取消分配。该对象将仅在“最后”释放时解除分配,即当保留计数降至零时。 NSMutableArray
将保留对象,直到将其从数组中删除,或者分配数组本身。该示例的优点是数组在添加时将retain
引用,因此在释放dateAttribute
之后,引用将不会被释放。但是,这不是一个好的风格,因为它的有效性完全取决于类NSMutableArray
本身的性质,它打破了我们不应该使用已发布引用的常见规则。
答案 1 :(得分:1)
从技术上讲,这是糟糕的风格,但确实有效。
NSMutableArray(runProperties addObject)在dateAttribute上调用retain
。因此,调用release不会破坏dateAttribute(仍有一个引用)。
出于可读性和重构原因,我还会将调用发送到release
最后。