我在Obj-C运行时从C调用可可。
我可以用这里的信息[1]创建块对象,并将它们作为参数传递给Cocoa方法,Cocoa方法根据需要保留它们,并在不再需要时释放它们。问题是,当块达到refcount 0并被释放时,我需要释放与块关联的其他资源,所以我需要一种方法来设置回调函数。
对于普通对象,我只需要子类化并覆盖dealloc()。我听说块也是对象--有没有可以子类化的Block类?或者有没有其他方法在释放和/或dealloc块时挂接函数?
谢谢。
[1][http://clang.llvm.org/docs/Block-ABI-Apple.html](http://clang.llvm.org/docs/Block-ABI-Apple.html)
3条答案
按热度按时间sg2wtvxw1#
你可以使用Obj-C Associated Objects API来关联一个对象示例和一个块示例。当块被释放时,关联的对象将被释放(如果它没有在其他地方被访问)。
使用关联对象的
-dealloc
方法执行任何所需的资源清理等。brccelvz2#
扩大我的评论:
我假设你用Clang编译器在C中创建你的块,如果你自己创建块描述结构,想法是一样的,但是你可以直接用正确的值创建结构。
如果您希望在处理块时调用清理函数,则(在大纲中):
您需要一个查找表来存储从块地址到辅助地址的Map,例如
NSMapTable
。高温加热
增编
正如我的quick'n'dirty测试代码在注解中所要求的,它只是遵循上面的伪代码。运行这个代码,你应该看到第二个和第三个块被释放,第一个不是因为它是一个静态文本,不需要释放。
jtw3ybtb3#
好吧,我是这么解决的。
首先,我创建了一个
block_literal
(定义为附加了一个block_descriptor
)。以下是设置字段的方法:
我为每个创建的块保存一个refcount,从1开始,以
my_copy_callback
递增,以my_dispose_callback
递减,当refcount达到0时,与该块关联的资源被释放。注:复制/释放助手不会在像NSString的
enumerateLinesUsingBlock
这样的同步方法上调用,因为这些方法在使用块时不会保留/释放块,因为它们假设块在调用期间保持可用。像dispatch_async()
这样的异步方法调用helper。在同一个块上多次调用dispatch_async()
应显示refcount递增两次,然后递减。