如何正确地分配/释放这个指针? Objective-C的

时间:2012-11-06 23:19:31

标签: objective-c ios memory-management dealloc

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

假设我有2个班级 - Foo,Bar

在类Bar中的

,我有一个指向Foo实例的指针,我在init期间设置了它。 (因为我不知道如何正确地互相导入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函数??
  5. 对于这种困惑感到抱歉,我们将非常感谢任何解释/答案!!

    P.S。我正在使用XCode 4.4并在iOS 5.0上运行cocos2d v2.1 beta ...我认为它正在使用arc

2 个答案:

答案 0 :(得分:3)

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

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

2)是的

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

4)“删除”不是有效的目标-c或有效的c。

P.S。不,你不希望在释放Bar之后该指针出现,因为那将是内存泄漏。也许你想要一个静态变量而不是实例变量?

答案 1 :(得分:1)

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

虽然您可以(应该?)使用ARC并省去一些麻烦,但了解常规保留/释放周期可以让您更好地理解ARC中的强弱参考。虽然您在使用ARC时无需了解objective-c中有关内存管理的所有内容,但您仍需要了解其中的一些内容。