使用(保留)属性时保留行为

时间:2012-02-22 17:22:28

标签: objective-c properties retain

大家好,我对以下问题有疑问。

我有两个对象:aClass和bClass。 aClass应使用retain属性包含bClass。 在实例化bClass之后(我在这里没有使用便利分配器,因为我想在这里解决我的误解问题),通过使用aClass的setProperty将bClass分配给aClass。

在整个过程中,我通过询问引用并通过询问aClass的属性来检查bClass的retainCount。

据我所知,目标C的内存管理,提到的保留计数应该是相同的,因为我在属性和引用之间共享对象的所有权。

在我看来,我在理解内存管理方面遇到了一个重大问题。也许有人可以向我解释我的错误。 Thx提前。

Header of ClassA

@property (retain )ClassB *myProperty; 


Source of ClassA

@implementation ClassA
-(id)init {

self = [super init];

if (self) {
    ClassB * bClass = [[ClassB alloc] init];
    NSLog(@"Temporary bClass retain count = %d", [bClass retainCount]);

    self.myProperty = bClass;
    NSLog(@"retain count after giving ownership to ClassA = %d", [bClass retainCount]);

    [bClass release];
    NSLog(@"retain count of bClass after release = %d", [bClass retainCount]);
    NSLog(@"retain count of myProperty of ClassA = %d", [self.myProperty retainCount]);
}
return self;
}

输出结果为:

临时bClass保留count = 1

在拥有ClassA = 2

的所有权后保留计数

在释放后保留bClass的计数= 1

保留ClassA = 2的myProperty的计数

3 个答案:

答案 0 :(得分:2)

retainCount没用。不要打电话。

特别是,它无法反映对象是否已被自动释放,并且atomic @property将在调用getter方法时保留/自动释放对象。

答案 1 :(得分:2)

保留并释放对象实例。指向对象实例的指针不是对象,它们本身不会被保留或释放。

首先有一个名为bClass的指针指向BCLass的一个实例。调用init时会保留该实例。 (保留计数= +1)

然后通过属性setter setMyProperty分配另一个指针。由于属性是使用retsain属性合成的,因此再次保留BClass的实例。 (保留计数= +2)

接下来,在bClass指向的BClass实例上调用release。 (这与myProperty属性指向的BClass的实例相同。(现在保留Count = +1。)

可以从文档中看到不使用非原子属性的效果:

  

默认情况下,属性是原子的,因此合成访问器提供对属性的强大访问   在多线程环境中 - 也就是说,从getter返回的值或通过setter设置的值是   无论其他线程同时执行什么,总是完全检索或设置。

     

如果指定strong,copy或retain并且未指定nonatomic,则在引用计数中   环境,对象属性的合成get访问器使用锁并保留和   自动释放返回的值 - 实现类似于以下内容:

[_internal lock]; // lock using an object-level lock

id result = [[value retain] autorelease];

[_internal unlock];

return result;

因此,看起来您正在记录语句引用属性,该属性保留对象(Retain = +2)并将其放入自动释放池中。 (发布将在稍后发布。

所有权只是意味着承担责任,告诉对象在释放它时所有者不再需要它。 Takiing的拥有权是通过保留对象实例(使用New,Init,Retain或Copy)来完成的。

答案 2 :(得分:1)

您需要记住的是,如果您分配它,复制它或新的它,那么您将获得一个对象的所有权,您需要释放它。我不担心retainCount的价值。