释放对象:[obj release]; 是不够的,需要[obj release],obj = nil;?

nik*_*ans 0 null memory-management objective-c retaincount

在这里我得到了一些丑陋的代码:

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 !
Run Code Online (Sandbox Code Playgroud)

如您所见,保留计数器返回1,我想这意味着该对象未被释放.如果我将该字符串更改为

[dateFormatter release], dateFromatter = nil;
Run Code Online (Sandbox Code Playgroud)

保留计数器返回0,这应该是因为它无法计算nil的保留:)

有什么东西我不了解保留计数器,或者这个对象真的没有发布?当我release第二次发送它(努力获得零保留计数)时,它会预期粉碎:)

还有一个问题:如果dateFormatter真的被释放了,为什么当我调用[dateFormatter retainCount]时它不会崩溃?

Sea*_*ell 7

你是正确释放你的对象; 不要担心保留计数.并且不要使用-retainCount.请参阅何时使用-retainCount?或者调用-retainCount被认为对有关原因的更多细节有害.

请注意,如果对象确实被破坏,那么此处的代码将崩溃(因为调用-retainCount是在您释放它之后发生的,可能是指向悬空指针); nil在完成变量之后设置变量是一个很好的习惯来防止这种情况发生.但它与您的代码是否泄漏无关.

  • 或者这可能是巧合.释放内存不会改变内容,因此悬挂指针似乎会继续工作,直到内存上出现乱写. (2认同)