2010-06-13 5 views
0

두 개의 클래스, "AppController"라는 컨트롤러와 Apple's URL Loading System Programming Guide의 샘플 NSURL 코드를 캡슐화하는 "URLDelegate"라는 클래스가 있습니다.Objective-C 및 NSURL : receivedData를 어디에 선언해야합니까?

가이드는 반복적으로 receivedData 인스턴스 변수를 "다른 위치"로 선언합니다. URLDelagate 클래스에서 선언하면 내 컨트롤러 클래스에서 다운로드 된 데이터를 "볼"수 없기 때문에 URLDelagate 클래스 외부에있는 것으로 가정합니다.

내가 데이터 때문에 내 connectionDidFinishLoading 기능에, 수신 된 것을 알고, 나는 NSLog의 결과 표시가 있습니다

NSLog(@"Succeeded! Received %d bytes of data",[receivedData length]); 
receivedText=[[NSString alloc] initWithData:receivedData encoding: NSASCIIStringEncoding]; 
NSLog(@"receivedText=%@",receivedText); 

을 그래서있어 다음 질문으로 난처한 상황에 빠진 조금 :

  1. receivedData를 선언해야합니까? 내 컨트롤러 클래스? 세 번째 수업인가요?
  2. 일반 NSMutableData 변수처럼 그냥 선언 할 수 있습니까?
  3. URLDelegate 클래스에이 변수에 "액세스"권한을 부여하려면 어떻게해야합니까? 예 : 예를 들어, 내 AppController 클래스에서 receivedData를 선언하면 URLControl을 URLDelegate 내에서 인스턴스화하지 않아도됩니까? 하지만 AppController 클래스가 처음 URLDelegate 클래스를 인스턴스화하는 경우 어떻게 가능합니까?

특히 마지막 질문과 관련하여, 나는 분명하고 근본적인 무언가를 간과해야합니다. 누군가가 올바른 방향으로 나를 가리킬 수 있다면, 나는 정말로 감사 할 것입니다.

감사합니다.

업데이트 : 모든 NSURL 함수를 URLDelegate 클래스 밖으로 이동하여 컨트롤러 클래스에 배치했습니다. 이제 controllerDidFinishLoading에서 컨트롤러 클래스의 변수를 업데이트 할 수 있습니다. 이것은 나에게 조금은 해커처럼 보이지만 작동합니다.

답변

1

1. receivedData는 어디에 표시해야합니까? 내 컨트롤러 클래스? 세 번째 수업인가요?

해당 메소드를 사용하는 메소드와 동일한 클래스로 선언되어야합니다. 귀하의 질문에, 그 클래스는 귀하의 URLDelegate 클래스 것 같습니다. 주석에서 명시 적으로 "인스턴스 변수"로 설명 되었기 때문에 클래스의 인스턴스 변수 블록에서 "다른 곳의 클래스"는 해당 클래스의 헤더 여야합니다.

2. 일반 NSMutableData 변수처럼 선언 할 수 있습니까?

예. the relevant chapter of The Objective-C Programming Language을 참조하십시오.

3. URLDelegate 클래스에이 변수에 "액세스"권한을 부여하려면 어떻게해야합니까?

클래스는 인스턴스 변수이기 때문에 인스턴스의 인스턴스 변수에 액세스 할 수 없습니다. 정의에 따르면, 그것들은 인스턴스의 일부분이며 인스턴스에 의해서만 액세스 가능합니다.그들이 어떤 로컬 또는 글로벌 변수, 샘플 코드와 같이 당신이 언급하는 것처럼

인스턴스는 인스턴스 변수에 액세스 :

receivedData = [[NSMutableData data] retain]; 

receivedData 당신이 당신의 URLDelegate 클래스에서 선언하려는 인스턴스 변수입니다. 참고로 "receivedData"라는 이름 만 사용하면됩니다. 다른 변수가 아닌 인스턴스 변수를 참조하기 위해 특별한 구문을 사용할 필요가 없습니다. 이런 이유로 인스턴스 변수와 로컬 변수에 동일한 이름을 지정하지 마십시오.

데이터를 앱 컨트롤러에서 사용할 수있게하는 데는 여러 가지 방법이 있습니다. 간단한 것은 URLDelegate의 속성을 노출하는 것이지만, 이는 앱 컨트롤러가 속성의 값을 검색하거나 다시 검색하는 방법을 알아야하는 문제로 이어집니다. 보다 포괄적 인 솔루션 목록은 the “Communicating with Objects” chapter of the Cocoa Fundamentals Guide입니다.

+0

대단히 감사합니다. 그것은 많은 혼란을 해결합니다. 제대로 이해하고 있다면 컨트롤러가 데이터를 확인하도록 경고하는 방법과 컨트롤러가 컨트롤러에 액세스 할 때까지 데이터를 유지하는 방법의 두 가지를 알아야합니다. – jthomas

+0

또는 데이터를 컨트롤러에 직접 전달하는 것이 가장 좋습니다. 실제로 URLDelegate 클래스조차 갖지 않는 것이 가장 좋습니다. 앱 컨트롤러를 연결의 대리자로 만드는 것이 더 좋습니다. –