我在这里得到了一些丑陋的代码:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy"];
NSDate *date = [NSDate date];
NSString *textWithYear = [NSString stringWithFormat:@"text and year %@", [dateFormatter stringFromDate:date] ];
[dateFormatter release];
NSLog(@"%i", [dateFormatter retainCount]); // returns 1 !
如您所见,保留计数器返回1,我想这意味着该对象未被释放。 如果我将该字符串更改为
[dateFormatter release], dateFromatter = nil;
保留计数器返回0,这可能是因为它无法计算nil的保留:)
是否有一些我对保留计数器不了解的东西,或者这个对象真的没有发布?当我第二次发送release
(努力获得零保留计数)时,它会预期粉碎:)
还有一个问题:如果dateFormatter真的被释放了,为什么当我调用[dateFormatter retainCount]时它不会崩溃?
答案 0 :(得分:7)
你正确地释放你的对象;不要担心保留计数。并且不要使用-retainCount
。有关原因的详细信息,请参阅When to use -retainCount?或Calling -retainCount Considered Harmful。
请注意,如果对象确实被破坏,那么此处的代码将崩溃(因为在您释放它之后调用-retainCount
并且可能是悬挂指针);完成后将变量设置为nil
是一个很好的习惯,可以防止这种情况发生。但它与您的代码是否泄漏无关。