有人可以帮助我了解Objective C属性中的引用计数。

假设我上课

@interface TA : NSObject
{
    TB* tb;
}
- (id) init;
- (void) dealloc;
@property (nonatomic,retain) TB* tb;
@end

@implementation
@synthesize tb;
- (id) init {...}
- (void) dealloc {...}
@end


我的理解是将新值分配给“ tb”,例如“ ta.tb = newValue”等效于以下逻辑:

if (newValue != oldValue)
{
    [newValue retain];
    [oldValue release];
    tb_storage_cell = newValue;
}


但是它如何在init方法中工作?

[TA alloc]是否用零预初始化实例内存?

我需要在init中执行tb = nil吗?

如果alloc确实使用零预初始化了内存,则由于初始化tb已经为nil,因此在初始化过程中不需要设置tb = nil。那正确吗?

另一方面,如果alloc不会将分配的内存清零,并且其中包含垃圾,那么设置程序尝试在初始化分配中释放旧值将失败,并且可能永远无法工作。那么,这是否意味着alloc确实可以保证返回总是归零的内存块?

接下来,解除分配。

假定序列在dealloc内部是:

[tb release];
tb = nil;
[super dealloc];


那正确吗?

但是,如果是这样,它又如何工作?首次发行应该发行“ tb”。然后,赋值“ tb = nil”应该再次释放tb的oldValue,因此它应该等于两次释放并崩溃。

还是我应该在dealloc中跳过“ [tb release]”,然后简单地执行

tb = nil;
[super dealloc];


最佳答案

Objective-C规范明确指出,所有对象实例在分配时都将其成员清零。

仅当您使用instance.property语法时,才调用属性的get和set方法。您的“ tb = nil”行只是将实例变量的值设置为nil,而不是调用该属性。

您必须执行self.tb = nil才能调用属性设置器。在dealloc方法中释放值时,通常应始终使用属性语法。

self.tb = nil;


这将正确释放并清除该属性。

关于iphone - Objective-C属性引用计数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3296489/

10-13 08:38