0

我有一个non-gc OS X应用程序。在这个应用程序中,我试图从块内将一个对象分配给一个块变量。然后这个对象被另一个线程从它所在的数组中清除。我假设因为它是一个non-gc应用程序,block_byref结构正在设置BLOCK_NEEDS_FREE标志,并且 dispose 辅助函数正在清理对象。副本足够安全吗?

- (void)assignFromArray
{
  __block NSObject iWantToKeep = nil;

  [myArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
  {
    if([[obj stringVar] isEqualToString:MyStringConst])
    {
       iWantToKeep = [obj copy];
       *stop = YES;
    }
  }];

/* Assume here that the array has been cleaned up by another thread
 * and all the objects in it have been released.
 *
 * Was a copy safe enough to survive the block_byref dispose
 * and the array objects being dealloc'd so that it can be accessed here?
 */
   NSLog(@"%@", [iWantToKeep stringVar]);

  //I only need it briefly, so it can be cleaned up here
  [iWantToKeep autorelease];
}
4

2 回答 2

3

是的,这非常有效。您只需确保在丢弃数组之前制作副本。

于 2012-12-17T09:38:02.713 回答
2

您需要在为其iWantToKeep分配新值之前释放,否则您将泄漏。

我不知道你为什么要copying 对象。我假设你需要复制的行为。该对象只需要保留(copy做 a retain)。

副本是否足够安全以在 block_byref 处置中幸存下来

此时iWantToKeep变量仍在范围内。所以它是可用的。

并且数组对象被释放以便可以在这里访问?

该数组不会“释放”其元素。它释放它们。由于我们保留了我们想要的对象,我们拥有它并且可以使用它。

这里假设数组已经被另一个线程清理干净,并且其中的所有对象都已被释放。

这似乎不安全。如果这种情况发生得稍早一点,在迭代中,并且数组在迭代时被修改或释放,就会发生不好的事情。

于 2012-12-17T19:51:06.267 回答