[英]iPhone EXC_BAD_ACCESS on accessing instance var in block
我有一個關於實例變量的問題,結合使用IOS5的Objective C中的塊和弧。
不久,當我訪問此代碼時,iPhone給了我一個EXC_BAD_ACCESS並終止:
- (void) doRequest: (void (^)(XMLTreeNode*) )completionHandler {
NSString * urlString = [NSString stringWithFormat:@"blablaurl=%@&", action];
for( NSString* key in parameters ){
urlString = [urlString stringByAppendingFormat:@"&%@=%@", key, [parameters objectForKey:key]];
}
NSURL * url = [NSURL URLWithString:urlString];
NSLog( @"Visiting: %@", [url absoluteString] );
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"GET"];
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse * response, NSData * data, NSError * err) {
NSLog( @"Params=%@", parameters );
completionHandler(e);
}];
}
exc_bad_access出現在:NSLog(@“Params =%@”,參數);
(參數是類的實例變量)..剛剛在頭文件中定義,沒有特殊屬性或者什么如此...
它為什么會崩潰,我該如何防止它? 謝謝!
我的猜測是它崩潰,因為在doRequest調用之后對象的生存期結束了,因此ARC清除了所有變量(以及該變量var)。當urlconnection完成並調用該塊時,實例變量被區域清理了..
參數由ARC清理。
這里有2種情況:
在塊完成之前不會釋放主對象:只需為“參數”創建一個強大的非原子屬性。 在屬性中使用“ strong”關鍵字對ARC來說,在您的所有主要對象生命周期中都需要“參數”
您的主對象在塊完成之前釋放:創建一個指向對象的新__block指針
__block blockParameters = parameters;
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse * response, NSData * data, NSError * err) {
NSLog( @"Params=%@", blockParameters );
completionHandler(e);
}];
使用“__block”關鍵字向ARC說,在所有塊生命期間需要“blockParameters”
在這種情況下,您只能使用塊的參數,即response
, data
和error
。 您可以使用[response URL]
來獲取參數。
NSString *path = [[response URL] path];
NSString *secondPartOfURL = [[path componentsSeparatedByString:@"?"] objectAtIndex:1];
NSArray *keyValuePairs = [secondPartOfURL componentsSeparatedByString@´:@"&"];
NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
for (NSString *pair in keyValuePairs) {
NSArray *keyValue = [pair componentsSeparatedByString:@"="];
[parameters setValue:[keyValue objectAtIndex:1]
forKey:[keyValue objectAtIndex:0]];
}
NSLog(@"Params=%@", parameters);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.