【问题标题】:please solve here retain count of NSString objects in Objective C请在此处解决在 Objective C 中保留 NSString 对象的数量
【发布时间】:2012-12-31 15:58:28
【问题描述】:

请解决这个问题。

NSString *S1 = @"abc";
//retain count of s1 ??

NSString *S2 = [S1 copy];
//retain count of s2 and s1 ??

NSString *S3 = [S2 copy];
//retain count of s3 and s2 ??

NSString *S4 = [S3 retain];
//retain count of s4 and s3 ??

NSString *S1 = @"xyz";
//retain count of s1, s2, s3 and s4 ??

不要建议retainCount,因为我认为这并不能给出确切的结果。

【问题讨论】:

  • 这闻起来像家庭作业。你认为答案是什么?
  • retainCount 返回一个完全精确的结果。这可能不是您所期望的。
  • NSLog(@"\nretain count=%d",[obj retainCount]); 一路返回-1..!!
  • 没错。保留计数不可靠、不可预测,最重要的是完全没有价值。不要在生产代码中发布它。
  • Your objects are constant strings and will never get deallocated.copyretain无论调用多少次都不会影响对象的内存管理。

标签: objective-c memory-management copy retaincount


【解决方案1】:

不建议使用retainCount,因为我认为这并不准确 结果。

正确。 retainCount 没用。 www.whentouseretaincount.com

您只能将保留计数作为增量进行有用的推理。


为了回答您的问题,对于该代码,保留计数是一个常量,并且没有任何代码行实际上做任何事情。在该代码的末尾,S2、S3 和 S4 都将具有相同的值;都将指向同一个字符串(显然,S1 将指向不同的字符串)。

这是因为一个实现细节。您正在使用一个常量字符串。它实际上是一个单例。因此,永远不需要复制字符串(copy 只做return self;),并且保留/释放/自动释放方法完全没有任何作用。

【讨论】:

    【解决方案2】:

    感谢@KurtRevis 的澄清编辑

    当然,假设 ARC 已关闭,您可以自己进行测试。但是你可能不明白为什么你会得到这些结果。以下是您应该得到的结果以及原因。

    NSString *S1 = @"abc";
    //retain count of s1 ??
    

    S1 是一个常量字符串文字,只要您的应用程序正在运行,它就永远不会离开内存。所以保留计数有点无关紧要。

    NSString *S2 = [S1 copy];
    //retain count of s2 and s1 ??
    

    S1 保持不变。 S2S1 的副本,保留计数为 1,没有自动释放

    NSString *S3 = [S2 copy];
    //retain count of s3 and s2 ??
    

    S2 在 1 处保持不变没有自动释放S3S2 的副本,保留计数为 1,没有自动释放

    NSString *S4 = [S3 retain];
    //retain count of s4 and s3 ??
    

    S4S3 现在指向同一个对象。并且该对象现在的保留计数为 2,并具有自动释放功能。一旦触发自动释放,它的保留计数将为 1,并且不会被释放。

    NSString *S1 = @"xyz";
    //retain count of s1, s2, s3 and s4 ??
    

    原来的S1指向的对象没有改变,它是内存中的一个持久字符串。现在S1 指向一个新字符串,它的处理方式与S1 过去指向的相同。


    或者只是省点麻烦并使用 ARC :)

    【讨论】:

    • 感谢亚历克斯。它是面试的一部分,面试官总是试图通过超越 ARC 来捕捉受访者的memory management 概念。如果我使用 ARC,我不能输入 retain
    • 这里没有自动发布。引用一个常量字符串不会自动释放任何东西。没有意义——它是一个恒定的字符串,它永远不会消失,也没有什么可以“清理”的。尝试在-[NSObject autorelease] 上设置断点并运行代码——断点不会被命中。
    • @KurtRevis 是的,我想。对我来说,将它们视为自动释放的实例是最简单的,因为您以相同的方式处理对象。但我认为你是对的,这并不完全正确。
    • @AlexWayne :这些我们大多数人都知道,但是当我们打印retainCount 时请告诉我们为什么它反映的不一样?
    • 绝对保留计数没有用。由于实现细节,它也不会是 1。也不会制作字符串的任何副本。如果面试官问了同样的问题并认为上面的内容是正确的,那么面试官不知道他们在说什么。
    猜你喜欢
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    相关资源
    最近更新 更多