2012-09-06 80 views
1

我正在實現Box2d(用C++編寫)的目標C封裝器。 b2Body在其userData字段中保留對其包裝器的引用。 GetUserData返回一個void *。我現在正在實施快速迭代,以便將B2B實體從B2World中提取出來。'從不兼容類型'分配'id'

我在下面指示的行中得到'來自不兼容類型'B2Body *'錯誤的'分配給'id'。爲什麼?

#import "B2Body.h" 
#import "B2World.h" 
#import "Box2d.h" 

@implementation B2World 

-(id) initWithGravity:(struct B2Vec2) g 
{ 
    if (self = [super init]) 
    { 
    b2Vec2 *gPrim = (b2Vec2*)&g; 
    _world = new b2World(*gPrim); 
    } 

    return self; 
} 

- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id __unsafe_unretained [])buffer count:(NSUInteger)len; 

{ 
    if(state->state == 0) 
    { 
    state->mutationsPtr = (unsigned long *)self; 
    state->extra[0] = (long) ((b2World*)_world)->GetBodyList(); 
    state->state = 1; 
    } 

    // pull the box2d body out of extra[0] 
    b2Body *b = (b2Body*)state->extra[0]; 

    // if it's nil then we're done enumerating, return 0 to end 
    if(b == nil) 
    { 
    return nil; 
    } 

    // otherwise, point itemsPtr at the node's value 
    state->itemsPtr = ((B2Body*)b->GetUserData()); // ERROR 
    state->extra[0] = (long)b->GetNext(); 

    // we're returning exactly one item 
    return 1; 
} 

`

B2Body.h看起來像這樣: #進口

@interface B2Body : NSObject 
{ 
    int f; 
} 

-(id) init; 
@end 
+0

下面哪條線表示? – deanWombourne

+0

標有// ERROR –

+0

的那個啊,對不起。我是盲人:) – deanWombourne

回答

2

NSFastEnumerationState是C結構,itemsPtr字段是:

id __unsafe_unretained *itemsPtr; 

在較早版本,__unsafe_unretained說明符是明顯缺失。

請注意,字段itemsPtr是一個指針ID。由於id本質上是一個指針,因此itemsPtr是一個指向對象指針的指針。實際上,這個字段是持有允許快速枚舉的對象數組的對象。基本上,它通過這個對象指針數組。

由於我對Box2d一無所知,這就是我所能說的。假定B-> GetUserData()返回一個指向對象的數組,你應該能夠做到這一點:

state->itemsPtr = (__unsafe_unretained id *)b->GetUserData(); 

雖然有點過時,Mike Ash's article仍然實現快速列舉的重要來源。

編輯

只注意到你是返回一個對象。所以,我假設GetUserData只返回一個對象指針。既然你需要返回一個指向對象的指針,你需要做這樣的事情:

id object = (__bridge id)b->GetUserData(); 
state->itemsPtr = &object; 

然而,棧對象將會消失,一旦你從這個方法,這就是爲什麼你傳遞一個堆棧返回你可以使用緩衝區。因此,您應該將該單指針填充到提供的堆棧緩衝區中:

*buffer = (__bridge id)b->GetUserData() 
state->itemsPtr = buffer; 
相關問題