关于retainCount需要澄清

时间:2012-07-05 12:43:36

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

  

可能重复:
  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];

我认为在此代码行执行 testString1 之后, testString2 testString3 retainCounts 1

我纠正了我的朋友吗?

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

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

由于

1 个答案:

答案 0 :(得分:2)

由于您在此示例中使用文字字符串retainCount并不重要(甚至不是delta),因为这些字符串对象实际上并不会被解除分类。

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

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