我正在开发一个带有C的Cocoa项目(我知道objc包含C ...),并且试图理解NSNotificationCenter。情况如下:

我有一个声明为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);
}


现在,如果我将第二个NSLog注释掉,一切似乎都可以正常工作(即打印“ here”)。但是,如果我将其保留,关于NSNotification的任何内容似乎都无效。但这似乎违反了NSNotification的对象,userInfo等的目的。

我在做什么错,如何解决它,以便可以访问我的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]];


...但是问题仍然存在。这与我修正的错字有关吗?

编辑:

即使将上面的两行更改为

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

最佳答案

Works for me.您在做什么不同的事情?

10-04 13:57