0

请查看我的代码:

@interface ClassA : NSObject {
    ClassB *objB;
}

@property (retain) ClassB *objB;
@end

@implementation ClassA:
@synthesiaze objB;
@end

int Main(int argc, const char *argv[])
{
    ClassA *objA = [[ClassA alloc] init];
    ClassB *objB = [[ClassB alloc] init];

    NSLog(@"%d", (int)[objB retainCount]);    // 1
    NSLog(@"%d", (int)[[objA objB] retainCount]);     // 0

    objA.objB = objB;

    NSLog(@"%d", (int)[objB retainCount]);    // 2
/* --> */    NSLog(@"%d", (int)[[objA objB] retainCount]);     // 3
    NSLog(@"%d", (int)[[objA objB] retainCount]);     // 4
    NSLog(@"%d", (int)[objB retainCount]);    // 4
}

请看第23行, NSLog(@"%d", (int)[[objA objB] retainCount]);

我认为结果应该是 2 而不是 3,但每次调用[objA objB]似乎都会将保留计数增加 1。我不知道发生了什么。谁能告诉我?谢谢!

4

3 回答 3

4
于 2011-04-25T17:06:43.097 回答
3

首先,不要依赖于retainCount总是 100% 准确。

也就是说,您所看到的只是因为合成的 getter 看起来像这样:

- (ClassB *)objB
{
    return [[objB retain] autorelease];
}

因此,当您通过合成的 getter 请求对象时,它会被保留并自动释放。那是因为你从非所有权 getter 获得的任何东西都应该在当前自动释放池的生命周期内持续存在,但如果你在此期间释放了 objA,那么情况就不是这样了。

于 2011-04-25T16:38:57.513 回答
2

您的 @property 未标记为nonatomic,因此 getter 不仅仅是简单的返回,而是锁定、保留、自动释放和解锁 - 出于线程安全目的。您可以编写自己的 getter 或将属性声明为 @property(非原子,保留)

于 2011-04-25T16:37:51.073 回答