2012-10-08 4 views
0

약한 포인터와 강한 포인터의 차이를 제대로 이해하지 못합니다. 지금까지 큰 문제는 발생하지 않았습니다. 문서의 예제를 따라 NSURLRequest를 만들고 NSURLConnection에서 데이터를 수신하는 데 사용하고 있습니다.NSData에 약한 포인터가 NSURLConnection을 사용하여 데이터를 읽을 수 없습니까?

코드는 다음과 같다 :

//create the request with url 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost:3000/students.json"]]; 

    //create the with the request 
    NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self]; 


    if (connection) { 
     //create NSData instance to hold data if connection is successfull 
     self.receivedData = [[NSMutableData alloc]init]; 
//  NSLog(@"%@",@"Connection successfully"); 
    } 
    else{ 
     NSLog(@"%@",@"Connection failed"); 
    } 

가 SO I 대리인 메소드의 본문 receivedData에 데이터를 추가.

@property (strong,nonatomic) NSMutableData *receivedData;

//delegate method 
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ 
    [self.receivedData appendData:data]; 
    NSLog(@"%@",@"Receiving Data"); 
} 
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{ 
    NSLog(@"Succeeded! Received %d bytes of data",[self.receivedData length]); 
} 

내가 위의 게시 된 코드는 노력하고 있습니다 :) 난 그냥가 고정되어 있기 때문이다.

내 질문은입니다. 포인터 유형이 원래 weak입니다. 내가 weak에서 strong으로 포인터 유형을 바꾸기 전에 항상 [self.receivedData length]에서 0 바이트의 데이터를 얻을 것이고 나는 왜 그럴 수 없는지 이해할 수 없다. 데이터를 보유하고있다.

답변

2

약한 참조가 내용에 적용되지 않습니다. receivedData 변수에 작성한 변경 가능 데이터 오브젝트를 보도록 지정했지만 보유하지 않아야합니다. 따라서 if 블록이 완료되면 데이터 범위가 끝나고 ARC가이를 해제합니다. 거기에 아무 것도 붙어 있지 않아 할당 해제되었고 receivedData는 더 이상 가리 키지 않았기 때문에 nil로 설정되었습니다. [self.receivedData length]self.receivedData이 없기 때문에 0 (기술적으로 nil)을 반환합니다. receivedData를 강하게 선언하면 가리키는 객체를 고정시키고, 끝내기 전까지는 주변에 있는지 확인해야합니다.

+0

좋은 답변 : 감사 – code4j

2

데이터

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://localhost:3000/students.json"]]]; 

NSURLResponse *response; 
NSError *error; 
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
NSString *strResponse = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 
// NSLog(@"%@",strResponse); 

SBJSON *sbJason = [[SBJSON alloc] init]; 
NSMutableDictionary *getNameList = [sbJason objectWithString:strResponse]; 
+1

이 작품 수도 있지만 UI 스레드가 :(? – code4j

+0

deligates이 방법으로 호출되지 않는다. 어떤 이유 차단을 가져 오기 위해 그것을 사용하려고? –

관련 문제