gpt4 book ai didi

iphone - Objective-C 属性引用计数

转载 作者:行者123 更新时间:2023-12-03 17:00:07 26 4
gpt4 key购买 nike

有人可以帮助我了解 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 确实用零预初始化内存,那么在 init 中似乎不需要设置 tb = nil,因为 tb 已经为零。是这样吗?

另一方面,如果alloc没有将分配的内存清零,并且它包含垃圾,那么setter在初始化赋值中释放旧值的尝试应该会崩溃,并且可能永远不会工作。那么这是否意味着 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 才能调用属性 setter 。在 dealloc 方法中释放值时,通常应始终使用属性语法。

self.tb = nil;

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com