【问题标题】:Release an object without a pointer?释放没有指针的对象?
【发布时间】:2010-12-29 18:58:49
【问题描述】:

我刚刚开始为 iPhone 进行开发,并且正在努力研究内存管理。我做了一个小程序,在地图上显示地图和注释。对于注释,我创建了一个实现 MKAnnotation 协议的简单类。

要创建和添加我写的注释:

[self.myMapView addAnnotation:[[MyAnnotation alloc] init]];

在我尝试释放该对象之前它运行良好。没有什么可以释放的。这就是我在 C# 中所做的,我想如果没有垃圾收集它就行不通?

那么这是唯一的方法吗?

MyAnnotation *myAnnotation = [[MyAnnotation alloc] init];

[self.myMapView addAnnotation: myAnnotation];

[myAnnotation release];

【问题讨论】:

    标签: objective-c ios memory-management


    【解决方案1】:
    [self.myMapView addAnnotation:[[[MyAnnotation alloc] init] autorelease]];
    

    【讨论】:

    • 对不起,我迟到了。我仍在为此苦苦挣扎,而您的答案就是我想要的答案。我已经设法再次发布了这个问题,这次关注的是内存泄漏,得到了和你一样的答案。
    【解决方案2】:

    是的,这是处理此类情况的公认方式。您也可以在 codelark 的回答中调用autorelease,但是在 iPhone 有限的内存环境中,自动释放有时会由于对象在最终释放之前逗留一段时间而导致问题。尽可能避免自动释放是一个好习惯。

    【讨论】:

    • “在可能的情况下避免自动释放是一个好习惯”——我不同意。只有在一次分配成百上千个对象时才能避免这种情况。在这种情况下,它是正确的成语。
    • +1 表示正确答案(示例 #2 是通常的做法),但无缘无故避免自动释放只是货物崇拜编程。在这种情况下,该对象已经被一个将在当前事件循环之后留在内存中的对象保留,因此避免自动释放将绝对节省 no 内存。
    • 注意到并感谢批评。我会记得在将来更好地限定我在这个问题上的陈述。
    • 避免自动释放绝对不常见也不建议,NSAutoreleasePool 会定期分配和释放,并且在向其对象发送释放时非常快......如果您不知道为什么,请不要避免自动释放,自动释放和release 各有各的用途,了解并正确使用,应该没问题的... 还要记得学习内存管理规则!
    【解决方案3】:

    大家,谢谢你的回答。

    在我看来,这段代码与我最初想到的解决方案最相似。

    [self.myMapView addAnnotation:[[[MyAnnotation alloc] init] autorelease]];
    

    【讨论】:

      猜你喜欢
      • 2011-09-15
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 2013-11-02
      • 2014-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多