gpt4 book ai didi

ios - 内存管理目标 - C

转载 作者:行者123 更新时间:2023-12-01 17:26:15 25 4
gpt4 key购买 nike

我正在阅读 memory management tutorial on iOS我想问一些问题。
本教程介绍了一个像这样实现的 setter 方法:

- (void)setCount:(NSNumber *)newCount {
[newCount retain];
[_count release];
// Make the new assignment.
_count = newCount;
}

以及两种实现方式 reset方法。

方法一。
我对这种方法的问题是这样的。在下面的代码中,可以看到 zero分配给 _count (通过 setCount)。但之后零被释放。
去哪里 _count指向现在?会不会造成以下情况 _count指向一个被释放的对象? (我只是从这些开始
事情,所以我所说的当然可能不正确)。
- (void)reset {
NSNumber *zero = [[NSNumber alloc] initWithInteger:0];
[self setCount:zero];
[zero release];
}

方法2。

在这里我有兴趣谁会发布 zero现在? (它必须正确释放,因为它是使用 alloc 创建的)。会在dealloc中完成吗?
- (void)reset {
NSNumber *zero = [[NSNumber alloc] initWithInteger:0];
[_count release];
_count = zero;

}

谢谢。

最佳答案

该教程略有损坏。错误提交。总有一天会修好的。

首先,既然你在学习,你应该使用ARC。即使你不使用ARC,你也应该使用@property宣布一切。

所以,你的标题中有:

@property(strong) NSNumber *count;

这既会自动创建 setter/getter 方法,也会创建一个名为 _count 的实例变量。 .

接下来,通过执行上述操作,将使用正确的内存管理保留/ Release模式创建 setter/getter,您不必担心它。代码越少越好。

最后,任何对象都会经历三个不同的阶段。初始化、运行生命周期、解除分配。

在初始化和释放期间,建议您直接管理实例变量。 IE。:
- init {
self = [super init];
if (self) {
_count = [[NSNumber alloc] initWithInteger:0]; // RC +1
}
return self;
}

- (void)dealloc {
[_count release]; /// RC -1
[super dealloc];
}

请注意,我直接设置了实例变量,并且 init 中的保留由 release 平衡在交易中。

现在,在操作生命周期内,您应该始终使用 setter 来更改值。这允许 setter 在子类中被覆盖以添加逻辑(实际上应该避免这种情况——让你的 setter 保持简单),它允许其他对象通过 Key Value Observing 观察你的对象的状态。

因此:
- (void)reset {
[self setCount: [[[NSNumber alloc] initWithInteger:0] autorelease]]; // RC +1, -1 (delayed)
}

现在,这看起来有点奇怪。 alloc 将保留计数增加 1,然后 setCount: 方法可能(它可能不会,实现细节,你不在乎)将保留计数增加 1。那 autorelease存在以平衡 alloc .

请注意,您可以缩短它:
- (void)reset {
[self setCount: [NSNumber numberWithInteger:0]];
}

上面的代码与 numberWithInteger: 中的第一个代码完全相同。创建 NSNumber 的自动释放实例.

甚至:
- (void)reset {
[self setCount: @0];
}
@0[NSNumber numberWithInteger:0]; 的新语法简写.

这里的关键是在您的 reset方法 你不必知道或关心什么setCount:对象 .如果写得正确——因为你使用的是自动合成的getter/setter——该方法将是 retain。对象(释放前一个对象),或者它可能会复制该对象。

底线:

引用计数非常简单;始终将其视为平衡的三角洲。对于每个 retain , 必须有 release .

关于ios - 内存管理目标 - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17570738/

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