Я работаю над проектом Какао с некоторым C (я знаю, objc содержит C ...) и пытаюсь понять NSNotificationCenter
s. Вот ситуация:
У меня есть структура, объявленная как 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
, все, похоже, будет работать (то есть «здесь» напечатано). Но если я оставлю это, ничего о NSNotification
, похоже, не сработает. Но это, кажется, противоречит цели объекта, userInfo и т. Д. NSNotification
.
Что я делаю не так и как я могу это исправить, чтобы у меня был доступ к моему structName f
?
@ Nathan
Хорошо, теперь у меня есть
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]];
... но проблема остается. Есть ли шанс, что это связано с опечаткой, которую я исправил?
Edit:
Проблема сохраняется даже при изменении двух строк выше на
[[NSNotificationCenter defaultCenter] postNotificationName:@"notName" object:nil userInfo:[NSDictionary dictionaryWithObject:[NSData dataWithBytes:f length:sizeof(structName)] forKey:@"fkey"]];