2

私はいくつかの C を含む Cocoa プロジェクトに取り組んでおり (objc には C が含まれていることはわかっています...)、NSNotificationCenters を理解しようとしています。状況は次のとおりです。

次のように宣言された構造体がありますtypedef struct {/*code here*/} structName;

私の- (id)init方法では、

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(selName:) name:@"notName" object:nil];

コールバック関数があります:

int callback(/*args*/) {
    structName *f = ...
    NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"notName" object:[[NSValue valueWithPointer:f] retain]];
    [autoreleasepool release];
}

そして、私のセレクターのために:

- (void)selName:(NSNotification *)note
{
    NSLog(@"here");
    NSLog(@"note is %@", note);
}

ここで、その 2 番目をコメントアウトするとNSLog、すべてが機能しているように見えます (つまり、「ここ」が出力されます)。しかし、そのままにしておくと、何も機能しないNSNotificationようです。しかし、これは のオブジェクト、userInfo などの目的を無効にしているようNSNotificationです。

私は何を間違っていますか?また、自分の にアクセスできるようにするにはどうすれば修正できますstructName fか?

@ネイサンさて、今私は持っています

NSDictionary *dict = [NSDictionary dictionaryWithObject:[NSValue valueWithPointer:f] forKey:@"fkey"];//f, not &f. I had a typo in the OP which I fixed.
[[NSNotificationCenter defaultCenter] postNotificationName:@"notName" object:nil userInfo:[dict retain]];

...しかし、問題は残ります。これは私が修正したタイプミスと関係がありますか?

編集:

上記の2行を次のように変更しても問題は続きます

[[NSNotificationCenter defaultCenter] postNotificationName:@"notName" object:nil userInfo:[NSDictionary dictionaryWithObject:[NSData dataWithBytes:f length:sizeof(structName)] forKey:@"fkey"]];
4

5 に答える 5

1

私のために働きます。あなたは何を違うのですか?

于 2009-06-29T02:51:44.733 に答える
1

+notificationWithName:object:userInfo:ではなく+notificationWithName:object:を使用する必要があります。

object パラメータは、通知を送信するオブジェクトです。通常、これは通知を投稿するオブジェクトの場合は self になりますが、これを C 関数から呼び出すため、nil にする必要があります。

userInfo パラメータは であるため、辞書にNSDictionary追加して送信します。NSValue

次に、selName: メソッドでNSNotificationから-userInfo dict を取得し、そこから情報を引き出します。

注:NSValueすべきでないときに を保持することで、リークを作成しています。

編集:

構造体はどのくらい存在しますか?NSValueポインターの内容をコピーしないので、割り当てが解除されている可能性がありますか? NSData代わりにのdataWithBytes:length:を使用してみてください。

また、コンソールで実行時エラーを確認してください (Xcode: Run > Console)。

また、辞書を保持する必要はありません。Cocoa メモリ管理ドキュメントを (再) 読みたいと思うかもしれません。

于 2009-06-28T20:10:25.167 に答える
0

NSValue構造体自体ではなく、構造体へのポインターが必要です。

[NSValue valueWithPointer:&f]

于 2009-06-28T19:20:50.413 に答える
0

2番目をコメントアウトするとうまくいくとあなたは言いましたNSLog。そして、その秒NSLogは間違っているようです:

- (void)selName:(NSNotification *)note
{
    NSLog(@"here");
    NSLog(@"note is %@", note);   
}

%@形式はを出力することですNSStringが、「メモ」は ではなくNSStringNSNotificationオブジェクトです。NSNotification には、 を返す name 属性がありますNSString。秒NSLogをこれに変更してみてください:

NSLog(@"note is %@", [note name]);
于 2009-11-24T21:55:42.513 に答える
0

代わりに、次を使用できます。

- (void)selName:(NSNotification *)note
{
    NSLog(@"here");
    NSLog(@"note is %@", [note userInfo]);
}
于 2011-09-07T12:58:56.740 に答える