【问题标题】:How to delete a c++ pointer in objective c with ARC如何使用ARC删除目标c中的c++指针
【发布时间】:2015-02-13 19:55:39
【问题描述】:

我正在包装 box2d 库,我想在包装器释放时正确释放 b2World 指针。我的问题是,我应该重写目标 c 中的 -dealloc 方法,还是 ARC 会自动释放 c++ *world 指针?

#import "World.h"
#import "Box2D.h"
@interface World()
@property b2World* world;

@end

@implementation World 
@synthesize world;

-(void) createWorld:(Vec2*) gravity{
    b2Vec2 g(gravity.x, gravity.y);
    world = new b2World(g);
}
-(void) dealloc{
    delete world;
    world = nil;
    NSString *temp = @"World DEALLOCATED!!";
    NSLog(@"%@", temp);
}

我是否正确实现了 -(void) dealloc 或者没有必要这样做?

【问题讨论】:

  • 保留你的dealloc,C++ 类没有 ARC。

标签: objective-c interop objective-c++


【解决方案1】:

ARC 不会自动计算 c++ 指针上的引用。您确实正确实现了dealloc,但您可能需要在调用delete 之前检查以确保world 不是0

【讨论】:

  • 0 上调用deletedelete[] 非常好。
  • 是吗?我似乎记得在 delete 0 上遇到过崩溃。
【解决方案2】:

我建议通读这篇文章。他通过一些陷阱和一些典型实践来帮助理解这一点:

http://coherent-labs.com/blog/objective-c-arc-gotchas/

基本上:似乎 ARC 只管理遵循 Obj-C 引用计数结构的对象。 C++ 对象的分配方法与 Obj-C 对象使用的分配方法不同,因此 C++ 对象没有引用计数,因此 ARC 不管理它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 2011-09-18
    • 2020-06-24
    • 1970-01-01
    相关资源
    最近更新 更多