将C与目标C混合

时间:2013-05-20 23:48:21

标签: objective-c c struct

我对这段代码示例中的内容感到有些困惑。 我正在创建一个名为'processingGraph'的C struct'AUGraph'属性。 然后我将此结构传递给Objective C方法 [self createAUGraph:_processingGraph];

然后我接受这个论点...... - (void) createAUGraph:(AUGraph) graph { NewAUGraph (&graph); ...并创建结构。

然而,这似乎并没有像我认为的那样在属性名称'_processingGraph'上创建结构。

这是为什么?通过将结构传递给目标C方法,它只是创建一个副本吗?在哪种情况下,我如何在方法中传递对结构的引用?

完整代码:

@interface AudioStepper ()
@property (readwrite) AUGraph processingGraph;

@end

@implementation AudioStepper

- (id) init{
if (self = [super init]) {
    [self createAUGraph:_processingGraph];
}
return (self);
}
- (void) createAUGraph:(AUGraph) graph {
NewAUGraph (&graph);
CAShow (_processingGraph); //no struct?
}

@end

2 个答案:

答案 0 :(得分:3)

graph不是方法中的指针,因此除了原始变量之外,它还会被复制到新的内存位置。就像传入int或float一样。这就是所谓的值传递。

然而,

C方法使用传递引用。它需要指针来绘制而不是复制值。

由于这是一个ivar,你可以直接访问指向_processingGraph的指针:

- (void) createAUGraph {
    NewAUGraph (&_processingGraph);
    CAShow (_processingGraph);
}

或者,如果您需要在不同时间传递不同的图形,您希望该方法获取指向AUGraph的指针,请使用按引用传递:

- (void) createAUGraph:(AUGraph*) graph {
    NewAUGraph (graph);     // Since graph is now a pointer, there is no
                            // need to get a pointer to it.
    CAShow (_processingGraph);
}

然后调用方法:

[self createAUGraph:&_processingGraph];

虽然修复了这些参数,但请务必阅读下面的danh答案,以便更好地创建结构。

答案 1 :(得分:2)

我看到你已经接受了答案。很高兴它的工作。当你接受的时候,我正在撰写这个建议,我认为这仍然是一个很好的建议......

从目标c CG结构中提取一些提示,例如CGPoint,并以这种方式定义你的结构:

// I've made up an AUGraph, since I don't know what yours looks like

typedef struct {
    // whatever is in here, say it's two ints
    int foo;
    int bar;
}AUGraph;

让你的属性分配......

@property (assign, nonatomic) AUGraph processingGraph;

最重要的是,以这种方式声明你的创作功能。 (这会更快,读起来更像其他库函数......

static inline AUGraph AUGraphMake(int foo, int bar) {
    AUGraph aug;
    aug.foo = foo;
    aug.bar = bar;
    return aug;
}

以下是打印功能的外观......

static inline NSString *NSStringFromAUGraph(AUGraph g) {
    return [NSString stringWithFormat:@"AUGraph: foo=%d, bar=%d", g.foo, g.bar];
}

看起来并不像原生的东西......

self.processingGraph = AUGraphMake(3,4);
NSLog(@"%@", NSStringFromAUGraph(self.processingGraph));