嘗試從其修改塊的外部訪問__block
(塊可變)變量時,遇到一個奇怪的問題。這是我使用只是爲了更好地瞭解一般塊的非常玩具的例子,但現在我有這個方法的控制器創建與使用NSDictionary
的enumerateKeysAndObjectsUsingBlock:
Obj-C __block變量保留行爲
NSDictionary
的內容的字符串
- (NSString*) contentsOfDictionary:(NSDictionary*)dictionary
{
__block NSString *content = @"";
[dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){
NSString* contentToAppend = [NSString stringWithFormat:@"Object:%@ for key:%@\n", obj, key];
content = [content stringByAppendingString:contentToAppend];
NSLog(@"Content in block:\n%@", content);
}];
NSLog(@"Content out of block:\n%@", content);
return content;
}
當運行該方法用含有內容的字典:
Value Key
"Queen" "card"
"Hearts" "suit"
"10" "value"
的content
變量塊內的正確修飾和我得到如下的輸出隨着每次迭代:
...內容塊:
Object:Queen for key:card
...內容塊:
Object:Queen for key:card
Object:Hearts for key:suit
...塊內容:
Object:Queen for key:card
Object:Hearts for key:suit
Object:10 for key:value
只要代碼步驟儘管如此,訪問content
字符串會拋出一個EXC_BAD_ACCESS
,並且在一次運行的情況下它似乎已經打印了一些垃圾內存(無法重現)...
什麼導致這個變量被提前釋放?我的印象是,給它一個__block
定義意味着它在塊中使用時被保留,並在塊退出時被釋放 - 但是該變量被保留和自動釋放以便作爲字符串文字開始,所以我期望在這種方法最早退出之前不會被處理。
沒錯。 – donalbain 2011-06-15 21:29:00