objective-c - ObjC : Local variable seems to retain its value across function calls

标签 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:(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 初始化停止变量来解决这个问题。

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

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

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

最佳答案

使用 ARC,只有指向 Objective-C 对象的指针被初始化为 nil (以及对象的所有实例变量),但一般不是局部变量。 所以你必须用

初始化 bool 变量
BOOL stop = NO;

关于objective-c - ObjC : Local variable seems to retain its value across function calls,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19275883/

相关文章:

javascript - 为多个 for 循环重新定义变量,好的还是坏的做法?

iphone - 自定义 UIButton 的不透明度

objective-c - AF网络进度方法

iOS 地址簿链接帐户记录不显示在排序的副本中

ios - 无法从文件路径创建 UIImage

rust - 当我克隆一个内部有 Arc 的结构时会发生什么?

javascript - 访问不在作用域内的函数

python - 如果为空,则 append 到 DataFrame 时出现问题

ios - 使用第三方库将代码重构为 ARC

iphone - SFHFKeychainUtils。 iOS 钥匙串(keychain)。弧兼容