将实例ID打印到NSLog?

15
在一个类的dealloc方法中,我该如何打印出被释放实例的ID(或其他唯一标识)?
- (void)dealloc {
    NSLog(@"_deallocing: ??");
    [super dealloc];
}

这可行吗?我只是想在控制台中获得更多的反馈以帮助学习。

非常感谢 -gary-

2个回答

54

如果你特别想要对象的内存地址(如果你在类中没有实现一个“标识符”的话,我想这也可以被认为是一个“标识符”),你可以使用以下代码:

NSLog(@"deallocing %p", self);

如果您有多个特定类的实例并且想确定哪个实例在进行dealloc时,这可能非常有帮助。


关于字符串格式说明符的文档:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html - Maic López Sáenz

7

试试这个:

- (void)dealloc {
    NSLog(@"_deallocing: %@", self);
    [super dealloc];
}

这将在控制台输出有关对象的更多信息。根据类别,您将获得内存地址和类名或更详细的内容。如果您想在自己的类中提供更详细的信息,请重写此方法并返回您想要的任何内容:

-(NSString *)description {
    return @"Something useful about this object";
}

很好,那么我可以假设“self”只是访问类的默认描述吗? - fuzzygoat
没错 - NSLog() 函数将 %@ 替换为给定对象的描述。NSObject 的 -description 方法提供了默认的 <classname : address> 值。在此处查看有关使用 NSLog 的更多有用信息:http://www.cocoadev.com/index.pl?NSLog - iKenndac
如果您想获得另一个类的ID怎么办?例如,我有一个成员变量NSMutableArray,我想打印它的实例ID。 - Rob S.
这样做没有问题 - 通常这就是你想要的 - 但我认为dmkash的答案更适合这个问题。如果描述被覆盖,这不一定会输出一个“唯一标识符”,正如问题所问的那样。 - DougW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接