0

*初学iOS程序员,请耐心解释

假设我有 2 个课程 - Foo,Bar

在类 Bar 中,我有一个指向 Foo 实例的指针,它是我在初始化期间设置的。(而且因为我不知道如何正确地相互导入 Foo 和 Bar,我最终将类型设置为 id 而不是 Foo)

@implementation Bar{
    id pointerToInstanceOfFoo;
}

我如何为 Bar 编写 dealloc 函数?还是我什至会覆盖 dealloc 函数?

现在我有

-(void)dealloc{
    pointerToInstanceOfFoo = NULL;
    [super dealloc];
}

我仍然希望当 Bar 死时指向 Foo 的指针仍然存在,但我做对了吗?几个问题:

  1. 如果 Foo 和 Bar 相互导入,我该怎么做?或者这是糟糕的软件设计?
  2. 现在我在@implementation 中设置了指针“pointerToInstanceOfFoo”...这是否等同于在类 Bar 中声明一个私有指针?
  3. 我应该改为使用 @property (nonatomic, weak) id pointerToInstanceOfFoo 吗?如果是这样,为什么我会不断收到关于 ARC 中没有弱指针的错误?
  4. 我需要 delete pointerToInstanceOfFoo; 在 dealloc 函数中吗?

对不起,任何解释/答案将不胜感激!

PS我正在使用XCode 4.4并在带有cocos2d v2.1 beta的iOS 5.0上运行......我认为它正在使用arc

4

2 回答 2

3

您不能[super dealloc]在 ARC 中使用。因此,如果编译成功,则说明您没有使用 ARC,您需要 calsretainrelease. 写一个完整的教程不适合堆栈溢出答案。至于你的其他问题:

1)只需将它们导入实现文件,而不是头文件。

2) 是的

3)如果它让你快乐。该错误可能意味着您的目标是低于 iOS 5.0(即项目设置中的部署目标设置为小于 5.0),其中不支持弱指针,或者 ARC 已关闭。我认为您没有准确地报告错误消息,因为它没有任何意义。

4)“删除”不是有效的objective-c 或valid c。

PS 不,您不希望在 Bar 被释放后该指针仍然存在,因为那将是内存泄漏。也许您想要一个静态变量而不是实例变量?

于 2012-11-06T23:30:42.297 回答
1

正如borrden 所提到的,保留/释放和objective-c 内存管理是一个相当大的主题,已经被广泛处理。我建议阅读本文以开始并从那里进行更多研究。

虽然您可以(应该?)使用 ARC 并为自己省去一些麻烦,但了解常规的保留/发布周期将使您更好地了解 ARC 中的强/弱引用。虽然在使用 ARC 时您不必了解有关 Objective-c 中内存管理的所有内容,但您仍然需要了解其中的一些内容。

于 2012-11-06T23:35:41.213 回答