gpt4 book ai didi

objective-c - Cocoa 中的内存管理

转载 作者:行者123 更新时间:2023-12-03 17:36:29 25 4
gpt4 key购买 nike

我正在尝试理解 Cocoa 中的内存管理概念。我被困在以下部分:::

//This is wrong code. But i want to understand why it is wrong!  
- (void) setEngine: (Engine *) newEngine
{
[engine release];
engine = [newEngine retain];
}

当newEngine和engine相同时,cocoa如何决定哪个作为实例变量,哪个作为参数?

例如:

Engine *engine = [Engine new]; // count: 1  
Car *car1 = [Car new];
Car *car2 = [Car new];

[car1 setEngine: engine]; // count: 2 -----How is the retain count 2 here?
[engine release]; // count 1

[car2 setEngine: [car1 engine]];

请帮助我,因为我想彻底学习这个概念,以保持我的程序的效率。我相信很多人都像我和我的 friend 一样被困在这个问题上..提前感谢...:)

最佳答案

首先,您要确保您的 setter 正在检查对象是否不同:

- (void)setEngine:(Engine *)newEngine {
if ( engine != newEngine ) {
[engine release];
[newEngine retain];
engine = newEngine;
}
}

以下是该方法内发生的事情:

  1. 检查传入的引擎是否与我们已有的引擎不同。如果相同,则无需执行任何操作。
  2. 释放引擎。如果我们是最后一个拥有它的对象,它的保留计数将为零,并且它将被释放。如果旧引擎为nil,则release消息将被忽略。
  3. 保留引擎。如果它被释放到其他地方,它不会被释放,因为我们已经获得了它的所有权。如果新引擎为nil,则retain消息将被忽略。
  4. engine 实例变量设置为 newEngine

其次,调用setEngine:后保留计数之所以为2,是因为它在创建时从1开始。然后,您将其分配给 car1,car1 保留了它,从而使保留计数达到 2。保留计数为 2,因为您的外部代码拥有它,并且 car1 拥有它。您应该以相同的方式将其传递给 car1 和 car2 ([car2 setEngine:car]),这将使保留计数达到 3。将其传递给 car1 和 car2 后,您可以释放它是你的外部代码 - 这告诉 Obcjective-C 你的外部代码不再拥有它,所有权仅属于 car1 和 car2。

这是一个完整的示例:

// create an engine, we will own it for now
Engine *engine = [[Engine alloc] init];

/* engine retain count: 1, owned by this context */

Car *car1 = [[Car alloc] init];
Car *car2 = [[Car alloc] init];

// pass engine along to cars
[car1 setEngine: engine];
[car2 setEngine: engine];

/* engine retain count: 3, owned by car1, car2 and this context */

// release engine, we no longer need it
[engine release];

/* engine retain count: 2, owned by car1 and car2 */

关于objective-c - Cocoa 中的内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4720719/

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