当出局时,"_ _ lock"变量导致nil值

Way*_*yne 5 objective-c objective-c-blocks automatic-ref-counting

我想使用__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;
Run Code Online (Sandbox Code Playgroud)

当我将代码更改为[路径复制]时,它可以工作.但我不知道这是不是一个好主意.任何决定?

    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];
Run Code Online (Sandbox Code Playgroud)

Tim*_*ddy 5

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

特别:

如果没有ARC,__block还有副作用,当它被块捕获时不保留其内容.块将自动保留并释放它们捕获的任何对象指针,但__block指针是特殊的,并充当弱指针.通过使用__block来避免保留周期,这成为依赖此行为的常见模式.

在ARC下,__block现在保留其内容,就像其他捕获的对象指针一样.使用__block来避免保留周期的代码将不再起作用.相反,如上所述使用__weak.

所以你需要复制.


Gre*_*ice 1

这里在路径上使用copy或者retain就可以了。您的问题的原因是 NSString 对象是便利对象的成员,以及其他对象(例如 NSArray),您实际上不必释放它们,并且在 ARC 之前就已经由系统自动释放了。就我个人而言,我不喜欢他们这样做,因为这只会造成这样的混乱。因为该块执行完毕,系统会自动释放您分配的字符串对象,从而导致泄漏。