保留合成属性的计数

| 请查看我的代码:
@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。我不知道发生了什么。谁能告诉我?谢谢!     
已邀请:
苹果对ѭ3的评价是这样的:   重要:在调试内存管理问题时,此方法通常没有任何价值。由于可能有许多框架对象保留了一个对象以保留对其的引用,而同时自动释放池可能会在一个对象上保留任何数量的延迟发布,因此从此获取有用信息的可能性很小方法。      要了解必须遵守的内存管理基本规则,请阅读“内存管理规则”。 不用担心保留数;如果调用
retain
alloc
或名称以
copy
mutableCopy
new
开头的方法,只需担心会调用
release
。     
首先,不要依赖ѭ3来始终保持100%的准确性。 也就是说,您看到的只是因为合成的getter看起来像这样:
- (ClassB *)objB
{
    return [[objB retain] autorelease];
}
因此,当您通过合成的吸气剂请求对象时,它会保留并自动释放。那是因为从非所有权获取器获得的任何东西都应该在当前自动释放池的生命周期内持续存在,但是如果您在此期间释放了objA,情况就不会如此。     
您的@property不会被标记为非原子的,因此,出于线程安全的目的,getter不仅是简单的返回,而且是锁定,保留,自动释放和解锁。您可以编写自己的getter或将属性声明为@property(非原子性,保留)     

要回复问题请先登录注册