ios在字典或数组中存储^块?

我可以将^块存储在字典或数组中吗?

我需要听一个服务器通知,我需要提供一个块来处理通知,在我的项目中,几个视图控制器都希望听到通知,所以我做了一个通用的通知pipe理器,它有自己的处理服务器块通知,它有一个代表arrays,所以在经理的块:

- (^)(NSString *message){ for (delegate in allDelegates) { delegate.handlerBlock(message); } } 

但我可以在块中存储块吗?

您可以将对象存储到集合中。 但是请注意范围:将它们保留在function范围之外时复制它们。 这是你的情况,因为你正在将它们存储在一个数组中。

 [NSArray arrayWithObject: [[^{ NSLog(@"block 1"); } copy] autorelease], [[^{ NSLog(@"block 2"); } copy] autorelease], nil] 

在ARC上,你仍然需要告诉它,你绝对需要复制块。 当数组被释放时它应该释放块。

  [NSArray arrayWithObject: [^{ NSLog(@"block 1"); } copy], [^{ NSLog(@"block 2"); } copy], nil] 

块的特殊之处在于,当保留其他对象时,它们应该在大多数情况下被复制。 正如您现在必须读取的那样,这是因为块从堆栈开始(“堆栈块”),并且仅在其定义的本地范围内有效。 复制一个堆栈块会给你一个堆块,并且像普通对象一样有一个dynamic的生命周期。 复制一个heap bock将会保留它,所以当你需要更长时间的时候复制一个块总是正确的。

现在,需要块参数的函数通常负责复制块。 所以在传递这些函数时,你不需要做任何特殊的事情。 然而,在这种情况下,你传递你的块到[NSArray arrayWithObject:] ,这需要一个普通的对象参数。 由于它不需要块参数,所以它不知道复制参数,所以它将保留它。 所以当你将一个块传递给一个采用普通对象参数的方法时,你需要先复制它。

如果你在这里阅读非常好的文章,你会发现如何做到这一点 。 并且特别注意那里提到的“先把它们抄下来”的习语。