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)
http://www.mikeash.com/pyblog/friday-qa-2011-09-30-automatic-reference-counting.html
特别:
如果没有ARC,__block还有副作用,当它被块捕获时不保留其内容.块将自动保留并释放它们捕获的任何对象指针,但__block指针是特殊的,并充当弱指针.通过使用__block来避免保留周期,这成为依赖此行为的常见模式.
在ARC下,__block现在保留其内容,就像其他捕获的对象指针一样.使用__block来避免保留周期的代码将不再起作用.相反,如上所述使用__weak.
所以你需要复制.
这里在路径上使用copy或者retain就可以了。您的问题的原因是 NSString 对象是便利对象的成员,以及其他对象(例如 NSArray),您实际上不必释放它们,并且在 ARC 之前就已经由系统自动释放了。就我个人而言,我不喜欢他们这样做,因为这只会造成这样的混乱。因为该块执行完毕,系统会自动释放您分配的字符串对象,从而导致泄漏。
| 归档时间: |
|
| 查看次数: |
903 次 |
| 最近记录: |