将数据传递给Cocoa Quartz事件点击回调 - 来自void *的错误转换

时间:2011-11-01 15:32:53

标签: objective-c macos cocoa casting

我正在Cocoa中编写一个简单的日志记录程序。

我创建了我的回调函数来将按下的键记录到文件中,但问题出现了。我的AppDelegate中有文件处理程序,我无法从回调函数中找到它。

我试图通过回调函数的最后一个参数(void*一个)将其传递到内部,但是我必须将其转换回NSFileHandle - 但要做到这一点我必须“桥接”它。但是,我是否使用__bridge__bridge_transfer程序崩溃。

我是Objective-C的新手,所以也许我错过了一些明显的东西,但我搜索了“全部”互联网,石英参考,堆栈溢出和谷歌搜索了几个小时,所以我将欣赏每一个提示。

谢谢 - M

1 个答案:

答案 0 :(得分:0)

我很惊讶演员 void *(当你创建水龙头时)是允许的。编译器是不是会给你一个错误? The ARC spec说它是禁止的。

void指针作为对象的唯一强引用是反模式。该对象应该是(在这种情况下)事件tap的所有者,或者对象应该拥有tap和需要保持活动的对象。使事件点击成为拥有者而不是拥有者更有可能在所有已设计的内存管理方案下工作,并使代码更清晰作为附带好处。

(这也适用于前块代码中的NSOpenPanels和NSSavePanels。)