我对这段代码示例中的内容感到有些困惑。
我正在创建一个名为'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
答案 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));