我认为api
很有趣- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(KeyType key, ObjectType obj, BOOL *stop))block
我注意到参数stop.At首先,我认为这是我从未见过的一种(BOOL *)。但文件说
讨论 如果块设置*停止为YES,则枚举停止。
看起来这个名为* stop的参数,我删除*会出错。
我想知道为什么?
答案 0 :(得分:1)
我认为这是关于Objective-C所基于的C语言的一个非常基本的问题。你不熟悉指针吗?
stop
是块的参数。它的类型是BOOL*
,意思是“指向BOOL的指针”。
-enumerateKeysAndObjectsUsingBlock:
实现中的某个地方是调用你所提供的块的代码。该代码已为BOOL
值创建存储空间。它将指向该存储的(a.k.a.地址)的指针传递给您的块,以便您的块可以通过写入指针来修改该存储位置的值。
语句*stop = YES;
将值YES
分配给BOOL
变量指向的stop
。这就是我在上面写的“通过指针写”。通过这种方式,块已经修改了调用者的变量,这就是调用者知道块希望枚举停止的方式。