【问题标题】:Memory Management ios7 [duplicate]内存管理ios7 [重复]
【发布时间】:2014-03-16 17:55:48
【问题描述】:

我有以下代码:

- (IBAction)HeyCount:(UIButton *)sender {
    NSString* strr = [[NSString alloc] initWithString:@"hi there"];
    self.string = @"789";
    ohYeah = @"456";
    NSLog(@"Retain Count of ohYeah:[%d] with String:[%ld]",[ohYeah retainCount],(long)[ohYeah integerValue]);
    NSLog(@"Retain Count of strr:[%d] with String:[%ld]",[strr retainCount],(long)[strr integerValue]);
}

上面代码的输出是:

Retain Count of ohYeah:[-1] with String:[456]

Retain Count of strr:[-1] with String:[0]

ohYeah 的声明在 .h 文件中

NSString * ohYeah;

我没有使用ARC。你们中的任何人都可以解释为什么strings 中的retain count-1 并且使用retain count -1 访问对象不应该崩溃吗?

【问题讨论】:

  • 不要使用保留计数
  • 我使用保留计数只是为了学习内存管理。
  • @OMerObaid 请参考前面三个关于何时使用保留计数来处理有关内存管理的内容。另外,你为什么不使用ARC? (提示 - 使用 ARC)。
  • @OMerObaid retainCount 对于学习内存管理不是很有用,在 MRR 和 ARC 下都没有。例如,编译器会根据优化级别和/或版本发出一组不同的保留和释放。

标签: objective-c ios7 retaincount


【解决方案1】:

您不应该仔细查看retainCount。

有些对象(如常量字符串)不参与保留/释放机制。例如,@"456" 就是这样一个常量字符串。你可以随心所欲地释放或保留它,什么都不会发生。

还有像@123 这样的其他对象,它们甚至不是 64 位系统中的对象。它们的行为类似于对象,但从未为它们分配内存。

在这两种情况下,保留计数都不会给出任何合理的结果。这就是为什么您应该查看保留计数非常非常罕见的原因。

还有像“copy”这样的方法,有时复制一个对象,有时只保留原始对象。因此,如果您有一个保留计数为 100 的对象,并且您制作了一个副本,则该副本的保留计数可能为 1 或 101。

【讨论】:

    【解决方案2】:

    我猜编译器很聪明,可以从您给定的代码中创建字符串文字。由于它们驻留在自己的内存空间中并且永远不会被释放,因此它们的保留计数为 UINT_MAX。使用 %d 打印的 UINT_MAX 将导致 -1。对无符号整数使用 %u。

    【讨论】:

    • Retain Count of ohYeah:[4294967295] with String:[456] 是我使用%u 而不是%d 时的输出
    • 这是 UINT_MAX,与 OP 预测的完全一样
    【解决方案3】:

    注意,retainCount 在NSObject.h 中是这样声明的:

    - (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE;
    

    您应该使用%u 在 32 位架构上显示它,并在 64 位上使用 %lu。 但是你不应该直接使用retainCount,在你的代码中使用它意味着你有架构问题,objective-c(ARC或Manual Reference Counting)给出了一套完整的机制来正确管理内存和对象的生命周期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-27
      • 2012-08-08
      • 2012-09-20
      • 1970-01-01
      • 2011-06-05
      • 2010-09-27
      相关资源
      最近更新 更多