繁体   English   中英

Objective-C属性参考计数

[英]Objective-C property reference count

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

假定序列在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;

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

您可以将方法编写为:

-(id) init{
if(self=[super init]){
tb = [[TB alloc] initWithSomething];
}
return self;
}

- (void) dealloc{
[tb release];
[super dealloc];
}
- (void) someMethod{
NSLog(@"This is ok since tb is always initialized. %@", [tb description]);
NSLog(@"This is also ok. %@", [tb description]);
}

这是典型的初始化,或者,如果您认为不必从开始处初始化tb,则可以使其变得懒惰:

-(tb) tb{
if (!tb)
   tb = [[TB alloc] initWithSomething];
return tb
}

 -(id) init{
    self=[super init];
    return self;
    }

- (void) dealloc{
[tb release];
[super dealloc];
}
- (void) someMethod{
NSLog(@"This might be not ok, tb is not necessarily initialized:%@ ", [tb description]);
NSLog(@"This is ok since tb is always initialized by the getter. %@", [self.tb description]);
}

这样,除非您在代码的其他部分进行了初始化,否则必须使用属性调用tb以确保已初始化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM