Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c ObjC:局部变量似乎在函数调用中保持其值_Objective C_Automatic Ref Counting_Scope_Objective C Blocks_Enumeration - Fatal编程技术网

Objective c ObjC:局部变量似乎在函数调用中保持其值

Objective c ObjC:局部变量似乎在函数调用中保持其值,objective-c,automatic-ref-counting,scope,objective-c-blocks,enumeration,Objective C,Automatic Ref Counting,Scope,Objective C Blocks,Enumeration,我刚刚在一个枚举器中偶然发现了一个奇怪的错误,我写道: // typedef for reference typedef void (^OGWEntityEnumerationBlock)(OGWEntity* entity, BOOL* stop); -(void) enumerateEntitiesInCategory:(const OGWEntityCategory*)category usingBlock:(OGWEntityEnu

我刚刚在一个枚举器中偶然发现了一个奇怪的错误,我写道:

// typedef for reference
typedef void (^OGWEntityEnumerationBlock)(OGWEntity* entity, BOOL* stop);


-(void) enumerateEntitiesInCategory:(const OGWEntityCategory*)category 
                         usingBlock:(OGWEntityEnumerationBlock)block
{
    BOOL stop;
    NSArray* entitiesInCategory = [_cagetorizedEntities objectForKey:category];

    for (OGWEntity* entity in [entitiesInCategory reverseObjectEnumerator])
    {
        block(entity, &stop);

        if (stop)
        {
            break;
        }
    }
}
第一次使用
enumerateEntitiesInCategory:usingBlock:
效果很好。最终,调用者会找到它正在搜索的实体,并将
*stop
参数设置为
YES

enumerateEntitiesInCategory:usingBlock:
的下一次使用在第一次迭代后立即退出。仔细检查后,一旦上一次迭代将
*stop
参数设置为YES,则
stop
立即初始化为
YES
。我必须有目的地用
NO
初始化stop变量来解决这个问题

这怎么可能?我知道stop变量的地址(可能是偶然的)可能在调用过程中保持不变,这将解释“旧”值的存在。但我的印象是ARC确保未初始化的类型分别设置为0
nil
,所以它不应该在每次调用函数时都将BOOL设置为NO吗

有趣的是,如果我使用
\u block BOOL stop
stop变量总是根据调试器初始化为YES,即使是在第一次(同样,可能是偶然的,这取决于该地址的任何未初始化值)


这似乎表明,我可能错误地假设未初始化的变量为零和ARC-也许ARC真的只关心用nil初始化对象类型,而不关心整数类型?或者这仅适用于IVAR,而不适用于局部变量?

只有指向Objective-C对象的指针使用ARC初始化为
nil
(以及对象的所有实例变量),但通常不包括局部变量。 因此,您必须使用

BOOL stop = NO;

正如Martin R在回答中提到的,变量需要初始化。至于为什么它似乎在没有(重新)初始化的情况下保持其值,可能只是因为您在调用树的同一级别调用了该方法(而不是函数),因此局部变量在堆栈上被分配了它以前拥有的相同插槽。结果:它“看到”的值与上次调用时的值相同。感谢您的确认,我想我最好重新检查代码中其他可能未初始化的非id类型。