Обычно возвращать массивы C по значению - плохая идея, поскольку массивы могут быть очень большими .Массивы Objective-C являются типами ссылок: они распределяются динамически, а ссылка, которая равна small , - это то, что передается.Вы также можете динамически распределять массивы C, используя одно из семейств malloc
для выделения и free
для освобождения.
Вы можете передавать структуры C по значению, и это обычно, как в общих структурахкак правило, small (или smallish в любом случае).
Теперь в вашем случае вы используете небольшой массив, в котором всего 4 элемента. Если вы считаете целесообразным передавать эти 4 значения вокруг по значению , и это хорошо подходит для вашего дизайна, то вы можете сделать это, просто внедрив массив C в структуру C:
typedef struct
{
b2Fixture *elements[4];
} b2FixtureArray;
...
-(b2FixtureArray) addFixturesToBody:(b2Body*)body forShapeName:(NSString*)shape
{
BodyDef *so = [shapeObjects objectForKey:shape];
assert(so);
FixtureDef *fix = so->fixtures;
int count = -1;
b2FixtureArray Fixi;
while(fix)
{
count++;
NSLog(@"count = %d", count);
Fixi.elements[count]= body->CreateFixture(&fix->fixture);
if (Fixi.elements[count] != 0)
{
NSLog(@"Fixi %d is not 0",count);
}
if (body->CreateFixture(&fix->fixture) != 0)
{
NSLog(@"body %d is not 0", count);
}
fix = fix->next;
}
return Fixi;
}
...
// sample call outline
b2FixtureArray result = [self addFixturesToBody...]
Подходит ли этот стандартный "трюк" C для передачи массивов по значению для вашего случая, вам придется решить.
Примечание: Если b2fixture
является Objective-CУбедитесь, что вы понимаете последствия управления памятью наличия массива ссылок на объекты в зависимости от используемой модели управления памятью (MRC, ARC, GC).