我正在尝试确定我是否做得正确:
如果我只有一个块,我会这样做:
__weak MyClass *weakSelf = self;
[self performBlock:^{ //<< Should I use self, or weakSelf here?
[weakSelf doSomething];
} afterDelay:delay];
但是如果一个块中还有一个块会发生什么?这样做是否正确?
__weak MyClass *weakSelf = self;
[self performBlock:^{
[weakSelf doSomething];
[self performBlock:^{
[weakSelf doSomething];
} afterDelay:1.0f];
} afterDelay:delay];
还有,在下面的函数中,我需要使用[block copy]吗?
- (void)performBlock:(void (^)(void))block afterDelay:(float)delay
{
if (block)
{
if (delay > 0)
{
[self performSelector:@selector(executeBlockAfterDelay:) withObject:[block copy] afterDelay:delay];
}
else
{
[self executeBlockAfterDelay:[block copy]];
}
}
}
- (void)executeBlockAfterDelay:(void(^)(void))block
{
if (block)
block();
}
-performSelector:withObject:afterDelay:
实际上是复制了这个块。 - Martin R-performSelector:withObject:afterDelay:
会保留anObject
参数,而不是复制它。 - Martin R[self executeBlockAfterDelay:[block copy]]
中加入[block copy]
(该方法名称取错了--它会立即执行),但是当传递给performSelector:
时需要加入。 - newacct@property(copy)
。但是知道确切的行为(取决于编译器、iOS/OS X版本、部署目标、ARC等)会很好。似乎有很多混淆,从“始终复制块”到“使用ARC时不需要复制块”。 - Martin R