我对这段示例代码中发生的事情有点困惑。
我正在创建 C 结构“AUGraph”的一个名为“processingGraph”的属性。
然后我将此结构传递给 Objective C 方法
[self createAUGraph:_processingGraph];
然后我接受这个论点...
- (void) createAUGraph:(AUGraph) 图 {
NewAUGraph (&graph);
...并创建结构。
然而,这似乎并没有像我认为应该的那样在属性名称“_processingGraph”处创建结构。
这是为什么呢?通过将结构传递给 Objective-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
最佳答案
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 的答案,以获得更好的创建结构的方法。
关于objective-c - 将 C 与 Objective C 混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16660012/