小编Pri*_*her的帖子

目标C区块:有没有办法避免"自我"被保留?

我试图尽可能简洁地写下来,但这并不容易描述 - 所以感谢阅读=)

我是开源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)

block objective-c objective-c-blocks

5
推荐指数
1
解决办法
2197
查看次数

标签 统计

block ×1

objective-c ×1

objective-c-blocks ×1