1

에서 인스턴스 VAR 접근에 나는 블록과 함께 인스턴스 변수 iOS5를 가진 목표 C에서 & 호에 대한 질문이 있어요. 이 코드에 액세스 할 때아이폰 EXC_BAD_ACCESS 블록

직후, 아이폰 내게 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)를 정리합니다. URL 연결이 완료되고 블록을 호출하면 인스턴스 변수 aready ..

+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"키워드를 사용

는 모든 블록의 삶

+0

우수 답변! 내가 왜 그것이 일어 났는지 설명을 포함해서 알 필요가 있었던 것! 덕분에 내가 여기에 놓친 거지 얼마나 많은 – Nick

+2

매개 변수 retainCount가 deallocing에서 ARC를 중지해야하므로, 그 안에 참조 된 개체를 유지한다있는 NSURLConnection로 전송 블록 ...? – ikuramedia

0

당신은 당신의 처리, 즉 response, data이 경우 error에서 블록의 매개 변수 만이 중 "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

블록 내에서 블록이 정의 될 때 어휘 범위에있는 모든 변수를 참조 할 수 있습니다. 변수의 유형에 따라 동작이 달라집니다. 객체 참조는 유지되지만 단순 변수는 참조로 전달하도록 __block 한정자로 참조하지 않는 한 const 복사됩니다. – ikuramedia

+0

글쎄,이 ** 블록에서 의미 ... – Mundi