“__block”在零值变量的结果,当外出块(“__block” variable results

2019-09-16 16:13发布

我想用__block变量块中获取价值。 但是,当出块之后,__block变量似乎是零。 为什么会发生这种情况?

    NSString *fileName = [Tools MD5Encode:url];
    __block NSString *filePath = nil;
    [fileList enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSString *aFileName = obj;
        if ([aFileName isEqualToString:fileName]) {
            NSString *path = [VERSIONS_INFO_DATA_DIRECTORY stringByAppendingPathComponent:aFileName];
            filePath = path;
            NSLog(@"filePath1 %@", filePath);
            *stop = YES;
        }
    }];
    //NSLog(@"filePath2 %@", filePath);
    //filePath seems to be nil
    return filePath;

当我修改代码,[路径复制],它的工作原理。 但我不知道这是否是一个好主意。 任何决定?

    NSString *fileName = [Tools MD5Encode:url];
    __block NSString *filePath = nil;
    [fileList enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSString *aFileName = obj;
        if ([aFileName isEqualToString:fileName]) {
            NSString *path = [VERSIONS_INFO_DATA_DIRECTORY stringByAppendingPathComponent:aFileName];
            filePath = [path copy];
            NSLog(@"filePath1 %@", filePath);
            *stop = YES;
        }
    }];
    //NSLog(@"filePath2 %@", filePath);
    return [filePath autorelease];

Answer 1:

http://www.mikeash.com/pyblog/friday-qa-2011-09-30-automatic-reference-counting.html

特别:

如果没有ARC,__block也有当它是由一个块捕捉不保留其内容的副作用。 块将自动保留和释放任何对象指针它们捕获,但__block指针是特例,并作为一个弱指针。 它已经成为使用__block避免保留周期依赖于这种行为的共同模式。

根据ARC,__block现在保留它的内容,就像其他的拍摄对象指针。 使用__block避免保留周期代码将不再工作。 取而代之的是,如上述那样使用__weak。

所以,你需要复制。



Answer 2:

它是确定这里使用复制或保留的路径上。 原因您的问题是,NSString对象与其他人一样的NSArray沿着便利对象的成员,你实际上并没有释放,并已经由之前的ARC天系统自动释放。 就个人而言,我不喜欢他们这样做的原因只是造成这样的混乱。 由于执行系统的块完成自动释放字符串对象,你分配导致泄漏。



Answer 3:

是利用块甚至这里的一个问题?

在我看来,这个代码序列:

NSString *filePath = nil;
NSString *path = [VERSIONS_INFO_DATA_DIRECTORY stringByAppendingPathComponent:aFileName];
filePath = path;
return [filePath autorelease];

过度释放filePath (因为你没有自己的结果-stringByAppendingPathComponent:你不应该(自动)释放它)



文章来源: “__block” variable results in nil value when go out of block