簡體   English   中英

在訪問塊中的實例var時使用iPhone EXC_BAD_ACCESS

[英]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”

在這種情況下,您只能使用塊的參數,即responsedataerror 您可以使用[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM