gpt4 book ai didi

objective-c - 如何从 Cocoa Notification 跳到 c 函数指针的调用?

转载 作者:太空狗 更新时间:2023-10-30 03:53:32 27 4
gpt4 key购买 nike

我想在我的环境中设置这样的东西。

[[NSUserDefaultsController sharedUserDefaultsController] addObserver:self
forKeyPath:[@"values." stringByAppendingString: @"MyPreference"]
options:NSKeyValueObservingOptionNew
context:NULL];

我正在 Smalltalk 环境中执行此操作。特定的 Smalltalk 实际上可以通过 objective-c 运行时功能驱动上述内容。问题在于 addObserver: 参数中的“ self ”。从 Smalltalk,我可以创建一个 C 函数指针,作为 Smalltalk 的回调。但它无法向 ObjectiveC 环境提供什么是对象的概念。

所以我想弄清楚如何使用适当的 API 从某种对象中跳转,从而导致我创建的函数指针被执行。我查看了 NSInvokation 和 friend ,但没有一个用于环绕 C 函数指针。而且我不确定他们是否会翻译 addObserver:forKeyPath:options:context: 来做正确的事情。

归结起来,问题是,如何使用现有的 Cocoa 对象来注册对通知的响应,即执行 C 函数指针而不编译任何新的 objc 代码。

最佳答案

您需要在 Objective-C 中创建一个粘合类。你可以这样做:

typedef void TravisGriggsCallback();

@interface TravisGriggsGlue {
TravisGriggsCallback *_callback;
}
- (id)initWithCallback:(TravisGriggsCallback *)callback;
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change context:(void *)context
@end

@implementation TravisGriggsGlue

- (id)initWithCallback:(TravisGriggsCallback *)callback
{
if (!(self = [super init]))
return nil;
_callback = callback;
return self;
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change context:(void *)context
{
_callback();
}

@end

如果需要将参数传递给回调,则需要添加实例变量来保存参数,并将它们传递给 init 方法。

然后你像这样使用它:

TravisGriggsGlue *glue = [[TravisGriggsGlue alloc]
initWithCallback:&someCallbackFunction];
[[NSUserDefaultsController sharedUserDefaultsController]
addObserver:self
forKeyPath:[@"values." stringByAppendingString: @"MyPreference"]
options:NSKeyValueObservingOptionNew
context:NULL];
[glue release]; // only needed if not using ARC

关于objective-c - 如何从 Cocoa Notification 跳到 c 函数指针的调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7911680/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com