【问题标题】:Clarification Needed Regarding retainCount [duplicate]需要澄清retainCount [重复]
【发布时间】:2012-07-05 20:58:49
【问题描述】:

可能重复:
NSString retainCount is 2147483647

假设我有一个名为 MyTestClass.h 的类。

三个 NSString 变量以不同的方式初始化

类结构是这样的

@interface MyTestClass : NSObject {

  NSString *testString1;
  NSString *testString2;
  NSString *testString3;

}

@property (nonatomic, retain) NSString *testString1;
@property (nonatomic, retain) NSString *testString2;
@property (nonatomic, retain) NSString *testString3;

@end

MyTestClass.m

@implementation MyTestClass

@synthesize testString1, testString2, testString3;


-(id) init{

    self.testString1 = @"";

    [self setTestString2:@""];

    testString3 = @"";

}

现在我打算创建一个MyTestClass

的对象
MyTestClass *obj = [[MyTestClass alloc] init];

我认为在此代码行执行后 testString1testString2testString3 retainCounts 将是 1

我说的对吗?

我可以知道如果我发布 testString3 会发生什么吗?

对此的任何帮助表示赞赏。

谢谢

【问题讨论】:

  • 依赖retainCount不好。我们永远无法确定框架保留了多少次对象。您阅读了这篇 ->friday.com/bbum/2011/12/18/retaincount-is-useless bbum 的精彩文章。基本上,依赖它们进行内存管理是不好的。
  • 我将上述问题作为重复链接,因为它还链接到与此确切主题相关的许多其他相关问题的树,以及在这种情况下您会看到的奇怪结果 (2147483647 )。似乎每个人都必须至少体验一次 NSString 的 retainCount 的怪异之处,然后才能意识到 retainCount 是多么无用(以及为什么 ARC 将其变成编译器错误是一件好事)。

标签: iphone objective-c memory-management properties retaincount


【解决方案1】:

由于您在此示例中使用文字字符串 retainCount 并不重要(甚至不作为增量),因为这些字符串对象实际上不会被释放。

但是,如果您为每个属性分配运行时分配的字符串,则前两个将被保留,第三个则不会。由于您的属性被声明为保留,并且您在一个中使用点语法,而在另一个中使用“setProperty”语法,因此执行相同的设置器并保留传递给该设置器的对象。第三个示例您只是将属性的支持 ivar 设置为右侧的值,而不影响其所有权。

值得注意的是,retainCount 仅作为增量有用,不应被视为明确的数字。你永远不应该明确检查retainCount 的值,因为它的绝对值是不可预测的并且没有用处。您似乎在您的问题中理解了这一点,但在处理 retainCount 时值得重申以确保所有相关人员都理解它。

【讨论】:

  • 感谢您的快速回复,但是我可以知道如果我发布 testString3 会发生什么。我没有发现崩溃!!!你能解释一下背后的概念吗?
  • 由于该对象没有在堆上分配,它实际上没有任何所有权。像这样静态声明的字符串是 NSString 类集群的一个具体子类,它呈现像调用 release 这样的动作没有实际意义。最好不要在您的示例中使用这些类型的字符串,因为它们是一种特殊情况,而是使用使用 stringWithFormat: 或其他便利构造函数声明的字符串。另外,由于您在谈论内存管理,我假设您没有使用 ARC。
  • 是的。我们没有使用 ARC,让您知道我是新手 :)。请您澄清一点。如果我调用 self.testString1 = @"hai"; 会发生什么两次?我认为它会泄漏内存。第一个保留的字符串不会被释放。我是否需要在第二次设置字符串之前覆盖“setTestString1”方法并进行释放调用?
  • 没有。综合属性的目的是让您不必编写 setter 和 getter。您只需提供选项(nonatomic, retain) 来合成您想要的属性,编译器会生成一个遵循这些选项的设置器。这仅在您使用self.someProperty 语法或[self setSomeProperty:aThing] 语法通过setter 时才有效。就保留/释放/所有权而言,直接分配给支持该属性的实例变量将无济于事。
猜你喜欢
  • 1970-01-01
  • 2011-12-28
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 2012-07-18
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多