1

IOS5のObjective Cのブロック&と組み合わせて、インスタンス変数に関する質問があります。ブロック内のインスタンス変数にアクセスするiPhone EXC_BAD_ACCESS

私は、このコードにアクセスすると間もなく、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 =%@"、パラメータ);

ただ、ヘッダ・ファイルに定義されて...、特別なプロパティまたは(パラメータは、クラスのインスタンス変数をある)何-SO-史上..

なぜそれがクラッシュしないと私はそれをどのように防ぐことができますか?ありがとう!

私の推測では、doRequest呼び出し後にオブジェクトの存続期間が終了し、したがってARCはすべての変数(およびそのパラメータvar)をクリーンアップするため、クラッシュします。urlconnectionが完了してブロックを呼び出すと、

+0

パラメータの種類を教えてください。 – Kamarshad

+0

そのNSDictionary – Nick

+0

あなたのパラメータを割り当てます。 NSLogを試して空であるかどうかを確認してください – Hiren

答えて

3

パラメータがARCによってクリーンアップされています。ここ

2ケース:

あなたの主な目的は、ブロックの完了前に解除されません。ただ、「パラメータ」のための強力な、非アトミックプロパティを作成します。あなたの財産で「強い」キーワードを使用すると、あなたの主な目的は、ブロックの完了前にリリースされ

、すべての主要な目的の寿命の間、あなたは、「パラメータ」を必要とすることをアークに言う:あなたのオブジェクトに新しい__blockポインタを作成

__block blockParameters = parameters; 
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse * response, NSData * data, NSError * err) { 
    NSLog(@"Params=%@", blockParameters); 
    completionHandler(e); 
}]; 
「__block」キーワードを使用して

あなたはあなたがすなわちresponsedataerrorこの場合、あなたの処分で、ブロックのパラメータのみを持っているすべてのブロックの寿命の間に

+0

優秀な回答!ただ、なぜそれが起こったのか説明を含めて知る必要があったもの!ありがとうたくさん – Nick

+2

NSURLConnectionに送信されるブロックは、その中で参照されるオブジェクトを保持する必要がありますので、retainCountパラメータはARCの割り当てを解除する必要があります...ここでは何が欠けていますか? – ikuramedia

0

を「blockParameters」を必要とすることをアークに言います。パラメータを取得するには、[response URL]を使用できます。

NSString *path = [[response URL] path]; 
NSString *secondPartOfURL = [[path componentsSeparatedByString:@"?"] objectAtIndex:1]; 
NSArray *keyValuePairs = [secondPartOfURL [email protected]´:@"&"]; 
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); 
+1

ブロック内で、ブロックが定義されているときにレキシカルスコープ内にある変数を参照できます。動作は変数のタイプによって異なります。オブジェクト参照は保持されますが、単純変数はconstでコピーされますが、__block修飾子を使用してそれらを参照して参照渡しにしない限り、constはコピーされます。 – ikuramedia

+0

さて、私はこの**ブロックで意味していた... – Mundi

関連する問題