在集合中存储一个块

13

是否可能直接将块存储在诸如NSArray之类的集合中?

2个回答

23

是的,块是有效的Objective-C对象,遵循NSObject的所有约定。只需执行复制/自动释放操作:

[array addObject:[[block copy] autorelease]];

对于ARC - 省略复制和自动释放调用:

[array addObject:block];

1
@Joseph 因为该块存在于堆栈上,当存储块后堆栈帧消失时,数组中的引用将变得无效。作为良好的实践,在使用数组后,您应将其设置为nil。 - Frank C.
当块被添加到数组中时,堆栈上的块肯定会获得+1个引用(无论如何都是通过ARC),因此仍然有效,对吧? - Joseph Humfrey
2
如果 ARC 能够确定块是分配在堆栈上的,它将自动进行复制,但如果它无法确定块是否已经在堆上分配,它将不会进行复制。当一个块被传递到一个方法中时,就会发生这种情况。编译器无法确定它是在堆栈上还是在堆上分配的。 - Tod Cunningham

1
无法确定如何在 Eimantas 的回答评论线程中作出回应,但 -copy 是必要的,因为该块可能已经在堆栈上创建。请参见bbum有关此主题的帖子中的第二点。

1
不,你不能直接回复评论。只需在其下面创建一个新的评论即可 :) - Hlung

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接