2011-11-01 35 views
0

我正在Cocoa中编写一个简单的日志记录程序。将数据传递给Cocoa Quartz事件接口回调 - 从void失效*

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

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

我是新来的Objective-C所以也许我错过了一些明显的东西,但我已经搜索了“所有”互联网,石英参考,堆栈溢出和谷歌搜索几个小时,所以我会感谢每一个提示。

谢谢 - 中号

+0

你确实有自动引用计数(ARC)开启,是吗?否则,桥梁施工将不合适。 – JWWalker

回答

0

我很惊讶投void *(当你创建TAP)是被允许的。编译器不是给你一个错误吗? The ARC spec说它是过时的。

拥有void指针是您对对象唯一的强引用是反模式。这个物体应该是(在这种情况下)事件点击的拥有者,或者一个物体应该拥有需要保持活跃的水龙头和物体。让事件分支被拥有而不是所有者更有可能在所有尚未设计的内存管理方案下工作,并且使代码变得更清洁,以此作为附带利益。

(这还要在预块码NSOpenPanels和NSSavePanels。)

+0

在将参数传递给回调函数之前,我没有投射到'void *'。我只是给它的对象的地址(通过'&')。 那天晚些时候,我试图将'bridge-cast'传递给'void *',然后将其作为参数传递给回调函数,并且工作正常。只要我在整个项目中只做了一次。否则会出现一些内存损坏。 谢谢你的回答,但是,我是Objective-C和Cocoa的新手,所以...如何让事件点击归属于我希望保留的对象('NSFileHandle')? 非常感谢 - M – user1023979

+0

我发现错误在哪里。这是可以的,如果你桥梁铸造无效 - >传递参数回调 - >内部回调桥 - 铸回原来的类型......但我失踪的是,我是桥梁铸造无效*和传递回调甚至在我初始化对象之前:-)非常感谢你,并为我感到遗憾 – user1023979

+0

@ user1023979:你不能让文件句柄拥有自己的tap,而且从MVC的角度来看它是没有意义的。你应该制作一个拥有两者的物体。 –