我试图尽可能简洁地写下来,但这并不容易描述 - 所以感谢阅读=)
我是开源iPhone框架麻雀的主要开发者.Sparrow以Flash AS3库为模型,因此具有与AS3类似的事件系统.目前,该系统通过指定选择器来工作 - 但我希望通过允许使用块用于事件监听器来扩展该系统.但是,我对内存管理问题感到磕磕绊绊.
我将向您展示一个典型的事件用例 - 现在处理它们.
// init-method of a display object, inheriting from
// the base event dispatcher class
- (id)init
{
if (self = [super init])
{
// the method 'addEventListener...' is defined in the base class
[self addEventListener:@selector(onAddedToStage:)
atObject:self
forType:SP_EVENT_TYPE_ADDED_TO_STAGE];
}
return self;
}
// the corresponding event listener
- (void)onAddedToStage:(SPEvent *)event
{
[self startAnimations]; // call some method of self
}
Run Code Online (Sandbox Code Playgroud)
这很简单:当一个对象被添加到显示列表时,它会收到一个事件.目前,基类将事件侦听器记录在NSInvocation对象的数组中.NSInvocation的创建方式是它不保留其目标和参数.(用户可以这样做,但在99%的情况下,没有必要).
不保留这些对象是一种有意识的选择:否则,即使用户在dealloc方法中删除了事件监听器,上面的代码也会导致内存韭菜!原因如下:
- (id)init
{
if (self …Run Code Online (Sandbox Code Playgroud)