大家好,我对以下问题有疑问。
我有两个对象: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的计数
答案 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的价值。