2012-02-22 99 views
-1

你好家伙我有一个关于以下问题的问题。保留使用(保留)财产时的行为

我有两个对象:aClass和bClass。 aClass应通过使用retain属性来包含bClass。 在instanciating 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保留计数= 1

给予所有权ClassA的= 2

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

保留ClassA的myProperty的数量= 2

+0

不要使用-retainCount这是没有用的。http://stackoverflow.com/questions/4636146/when-to-use-retaincount – newacct 2012-07-06 01:20:34

回答

2

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

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

然后,通过属性setter setMyProperty指定另一个指针。由于该属性与retsain属性进行了合并,因此BClass的实例会再次保留。 (保留计数= +2)

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

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

属性是默认原子,使得合成的访问器提供在多线程环境 - 即鲁棒访问属性 ,所述从getter返回的值或通过setter设置的值是 总是完全检索或设置,而不管其他线程是否同时执行。

如果指定强劲,复制或保存并且不指定非原子,然后在引用计数 环境中,一个对象的属性合成get访问使用了锁,并保留和 自动释放返回值,实施将类似于以下内容:

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

id result = [[value retain] autorelease]; 

[_internal unlock]; 

return result; 

所以看起来你记录语句引用属性,它保留了对象(保留= +2),并把它放入自动释放池。 (发布将在稍后发布

所有权仅仅意味着承担责任,告知该对象在发布时不再需要该对象。Takiing拥有权通过保留对象实例完成(使用New ,初始化,保留或复制)

+0

非常感谢,这帮了很大的忙! – user1214249 2012-02-23 09:18:26

+0

“调用init时保留该实例”调用'alloc'时实际保留该实例。 'init'在概念上并没有改变保留计数 – newacct 2012-07-06 01:18:44

2

retainCount没用。别叫它。

特别是,它永远不会反映一个对象是否已被自动释放,并且在调用getter方法时将保留/ autorelease对象。

+0

没有属性使用(保留)autorelease一个对象,以防对应的getter被调用吗?我认为这与原子没有任何关系 我可以假设我对该属性的使用是正确的吗?尽管我使用了retainCount。 – user1214249 2012-02-22 19:23:37

+0

这是一个执行部分IL;原子属性将保留/ autorelease get,非原子不会。而且,是的,在这个例子中使用bClass不会泄漏。 – bbum 2012-02-22 21:08:11

+0

@ user1214249:如果感觉像这样,属性getter/setter可以保留并自动释放5次。你不能依赖它。添加retain/autorelease从不会降低代码的正确性。所以任何功能都可以随心所欲地使用它,因为它非常谨慎。 – newacct 2012-07-06 01:27:31

1

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