2012-07-20 96 views
1

这是关于使用__block释放块内的对象;块内释放对象

NSString *str = [SomeObject methodName]; // returned object is autoreleased 
[str retain]; //retaining the object since its auto released 

现在我将在块内使用此str对象。内部块我会释放这个对象。 我是否需要像__block NSString *str = ..这样的前缀,因为iam在块内释放它? 从规则我明白,如果我们想修改块内的对象,我们需要前缀__block。但是这个规则适用于释放吗?

+0

你不应该保留块之外的东西,并在块内释放它们。 Cocoa中的内存管理是本地的。每个范围只对自己负责。该块的身体没有保留它,所以不应该释放它。另外,不能保证块将被运行(在这种情况下,如果它负责释放,会发生泄漏),或者可能运行多次(在这种情况下,它将被过度释放)。 – newacct 2012-07-20 17:43:17

回答

3

编号__block需要变量要修改。释放对象并不意味着修改变量。相反,这意味着发送一个release消息到有问题的对象。与其他任何消息一样,没有理由不能将release发送到块内的对象实例,即使没有__block限定符。

您应该知道,对于非__block限定对象变量,该块将保留该对象。因此,虽然块内部明确的release可能会在调用块之前在外部/之间平衡retain,但直到块本身被释放后,即使没有其他对象保留它,对象也不会实际被释放(至少)。

+0

感谢您的澄清。即使你不修改块内的对象,是否有使用__block限定符的副作用? – sach 2012-07-20 04:08:45

+0

我刚刚编辑了我的答案(在评论之前您可能没有看到)提及__block将导致块本身不保留有问题的对象。有一个非常好的帖子,包括这里的信息:http://www.mikeash.com/pyblog/friday-qa-2009-08-14-practical-blocks.html – 2012-07-20 04:11:02