如何使用 ARC 删除 objective c 中的 C++ 指针
How to delete a c++ pointer in objective c with ARC
我正在包装 box2d 库,我想在包装器解除分配时正确解除分配 b2World 指针。我的问题是,我应该覆盖 objective 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 还是没有必要这样做?
我建议通读这篇文章。他通过一些陷阱和一些典型的做法来帮助理解这一点:
http://coherent-labs.com/blog/objective-c-arc-gotchas/
基本上:ARC 似乎只管理遵循 Obj-C 引用计数结构的对象。 C++ 对象没有使用 Obj-C 对象使用的相同分配方法分配,因此 C++ 对象没有引用计数,因此 ARC 不管理它们。
ARC 不会自动计算 C++ 指针上的引用。您确实正确地实现了 dealloc
,但您可能希望在调用 delete
之前检查以确保 world
不是 0
。
我正在包装 box2d 库,我想在包装器解除分配时正确解除分配 b2World 指针。我的问题是,我应该覆盖 objective 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 还是没有必要这样做?
我建议通读这篇文章。他通过一些陷阱和一些典型的做法来帮助理解这一点:
http://coherent-labs.com/blog/objective-c-arc-gotchas/
基本上:ARC 似乎只管理遵循 Obj-C 引用计数结构的对象。 C++ 对象没有使用 Obj-C 对象使用的相同分配方法分配,因此 C++ 对象没有引用计数,因此 ARC 不管理它们。
ARC 不会自动计算 C++ 指针上的引用。您确实正确地实现了 dealloc
,但您可能希望在调用 delete
之前检查以确保 world
不是 0
。