Memory 您能否将保留计数发送到NSLog以帮助学习?

Memory 您能否将保留计数发送到NSLog以帮助学习?,memory,retain,nslog,Memory,Retain,Nslog,只是想知道是否有使用NSLog显示对象保留计数的方法。我只想将它们打印到控制台,以帮助了解在一些简单的代码中如何使用retain/release 干杯-加里-这不仅是可能的,而且非常简单: NSLog(@"retain count=%d",[obj retainCount]); 在调试器控制台中,您可以键入:print(unsigned int)[thing retainCount]我想您可能遇到了NSString的问题,在NSString中,retain和release消息可以发送到字符串常

只是想知道是否有使用NSLog显示对象保留计数的方法。我只想将它们打印到控制台,以帮助了解在一些简单的代码中如何使用retain/release


干杯-加里-

这不仅是可能的,而且非常简单:

NSLog(@"retain count=%d",[obj retainCount]);

在调试器控制台中,您可以键入:print(unsigned int)[thing retainCount]

我想您可能遇到了NSString的问题,在NSString中,retain和release消息可以发送到字符串常量,但它们实际上没有效果,也不会改变对象的retainCount。下面的代码有效,将其更改为使用NSString,保留/释放无效

代码:


gary

请注意,保留计数是一个实现细节,它们可以并以对外部观察者毫无意义的方式工作。换句话说,这不是一件特别有用的事情。最好阅读内存管理指南()并遵循简单的所有权规则。从技术上讲,它应该是%u,因为retainCount返回一个整数(实际上它永远不会变得足够大而重要)@Chuck:从技术上讲,你是正确的,但在现实生活中,它有时可以帮助您查明保留/发布问题。我不能否认这一点,但有一次记录重新登录帮助我发现了一个愚蠢的错误。
retainCount
几乎没有用。有时它会有帮助,会浪费你的时间,让你更加困惑。有很多更好的工具来跟踪保留/发布问题。不调用-重新计数
#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSMutableString *myString = [[NSMutableString alloc] initWithString:@"AB"];
    NSLog(@"RC: %d", [myString retainCount]);
    [myString retain];
    NSLog(@"RC: %d", [myString retainCount]);

    [myString release];
    NSLog(@"RC: %d", [myString retainCount]);
    [myString release];

    [pool drain];
    return 0;
}
Running…
TESTBED[12306:a0f] RC: 1
TESTBED[12306:a0f] RC: 2
TESTBED[12306:a0f] RC: 1