Objective C,UIGestureRecognizer分配和发布

时间:2012-02-17 14:42:56

标签: objective-c ios xcode

我是obj-c的新手,我只是想知道是否有人可以解释这一点。在这里,我们将UIGestureRecognizer添加到当前视图,然后我们立即发布它,为什么?如果我们发布它会不会使它在程序中无用?

recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];

((UIPanGestureRecognizer *)recognizer).minimumNumberOfTouches = 3;

[self.view addGestureRecognizer:recognizer];

[recognizer release];

2 个答案:

答案 0 :(得分:2)

执行时:

[self.view addGestureRecognizer:recognizer];

手势识别器保留计数增加。因此,以下release只是平衡alloc / init操作,它返回一个保留计数为1的对象。

换句话说,你可以用这些术语思考:

  1. alloc - >保留对象;
  2. addGestureRecognizer - >保留对象;
  3. 因为您希望self.view成为手势识别器的唯一所有者,所以您只需拨打release一次即可恢复原状。当self.view被解除分配时,它将在其手势识别器上调用release,这也将被解除分配。

    如果你没有这样做,你会发生内存泄漏,因为当取消分配self.view时,会在手势识别器上调用release,但这不足以使保留计数下降为零(因为retain隐含的初始alloc)。

    希望这能澄清一些事情。

答案 1 :(得分:0)

在iOS中有一些叫做(保留计数)的东西,这是一个内部计数器,用于跟踪对象或对象使用的所有引用..所以每次你做(分配,复制,保留)到对象它将增加其保留计数器1 ..在这三种情况下,你负责(释放)对象,这将减少计数器也为1 ..在你的情况下你做了正确的事情释放对象,但它没有' t deallocated因为当你将它添加到视图时它的保留计数器增加1,所以它仍然在内存中,但你不负责删除它iOS将为你做这个(自动释放)。希望这会有所帮助。祝你好运。