2

このコード例のスニペットで何が起こっているのか、少し混乱しています。C構造体「AUGraph」の「processingGraph」というプロパティを作成しています。次に、この構造体を 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
4

2 に答える 2

3

グラフはメソッドのポインターではないため、元の変数とは別に、新しいメモリ位置にコピーされます。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 の回答を必ずお読みください。

于 2013-05-21T00:00:14.310 に答える
2

あなたが回答を受け入れたことがわかります。それがうまくいっていることをうれしく思います。あなたが受け入れている間、私はこのアドバイスを書いていましたが、これはまだ良いアドバイスだと思います....

CGPoint などの Objective-C CG 構造体からヒントを得て、次のように構造体を定義します。

// 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));
于 2013-05-21T00:22:44.897 に答える