我正在开发一个带有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.您在做什么不同的事情?