objective-c - 将 C 与 Objective C 混合

标签 objective-c c struct

我对这段示例代码中发生的事情有点困惑。 我正在创建 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/

相关文章:

c - 基本的 C 问题 - 当你在 C 中声明一个静态变量时到底发生了什么?

指令级别的调用(依赖)图

python - 类工厂来生成简单的类结构类?

c - 将 C 结构迁移到 Delphi 记录

ios - 如何在 iOS 6 中为文本添加下划线?

objective-c - count 是否是一个属性?

c - 在 Linux/Unix/Posix/BSD 类型系统上解析 DNS TXT 记录的最佳方法?

objective-c - 在图像查看器中缩放

iphone - 来自 UITextField TextDidChangeNotification 的文本

Swift SpriteKit 使用结构而不是类来渲染 Sprite