有人可以帮助我了解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/