2009-06-01 3 views
0

일부 클래스가 Appdelegate에서 초기화되었지만이 클래스 인스턴스가 다른 클래스의 Appdelegate 양식에서 "신선한"상태가되면다른 클래스에 대한 참조를 제대로 얻으려면 어떻게해야합니까?

나는 AppDelegate에에 다음과 같은 한 :

인터페이스 :

@property (nonatomic, retain) DataController *dataController; 

구현 :이 시점 DataControlelr 클래스로드에서

@synthesize dataController; 
- (id)init { 
    if (self = [super init]) { 
     DataController *controller = [[DataController alloc] init]; 
     self.dataController = controller; 
     [controller release]; 
     NSLog(@"items: %d",[self.dataController numberOfItems]); 
    } 
    return self; 
} 

양식 데이터베이스 객체. 로그 출력은 "항목 : 10"을 표시합니다.

DataController를 사용해야하는 TableViewController가 있습니다.

TableViewController 헤더 :

@interface TableViewController : UITableViewController { 
    DataController *dataController; 
} 

@property (retain) DataController *dataController; 
@end 

구현 : 여기

-(id)init{ 
    if (self =[super init]) { 
     DataController *dc =[(AppDelegate *)[[UIApplication sharedApplication] delegate] dataController]; 
     [dc retain]; 
     dataController = dc; 
     NSLog(@"items: %d",[self.dataController numberOfItems]); 
    } 
    return self; 
} 

항상 DataController 0 항목이 있다고 말한다. "신선한"상태. 10

항목 : 0 그것은 그 클래스를 할당하는 것 같아

는 참조 갓 어떻게 든 DataController을 초기화하기 위해 만들어

로그 출력은 항상

항목입니까?

어떻게하면 다른 클래스를 제대로 참조 할 수 있습니까?

감사합니다.

답변

1

두 번째 클래스의 dc 변수가 '복귀'0

에 호출 어떤 방법 또한 유용 할 수 있습니다를 일으킬 것이라고를 nil--되지 않도록하는 것입니다 확인하기 위해 우선 두 메서드 모두에서 응용 프로그램 대리인의 주소를 인쇄 할 수 있습니다. -init 메서드가 해당 클래스의 두 번째 인스턴스가 잘못 할당 된 결과이며 정규 버전이 같은 방식으로 초기화되지 않은 경우 (또는 -initWithCoder: 등을 사용하고 있었다)

nib 파일 내에서 생성되거나 할당 된 객체의 초기화에 대한 유용한 경험 법 중 하나는 -awakeFromNib을 사용하면 대부분의 초기화 작업을 수행 할 수 있습니다. 이에 대한 결과는 앱 대표가 -applicationDidFinishLaunching: 메소드에 대한 응답으로 상태를 설정할 수 있다는 것입니다. 이 경우, AppDelegate 클래스의 두 번째 인스턴스가 어딘가에 할당되면, 이 실제로이 앱의 위임자로 설정된 인스턴스 만 -applicationDidFinishLaunching:을 받게됩니다.

하루가 끝날 때 디버거를 단계별로 실행하고 호출 스택을 살펴보면 뭔가 이상한 일이 일어나지 않아야합니다.

0

TableViewController에서 dataController = dc의 과제에 문제가있을 수 있습니까?귀하의 성명서에 self.dataController을 사용하십시오. 바로 위의 과제가 self.dataController = dc일까요?

+0

죄송합니다. 잘못 붙여 넣었습니다. 그것은 self.datacontroller = dc입니다. 아무런 차이가 없습니다. – Rod

0

나는 잡았다. 짐 탱크!

-init에서 -awakefromnib로 할당이 이동되었으므로 이제 DataController가 유효합니다.

내 실수는 처음에 코드를 -viewDidLoad 및 -viewWillAppear에 넣은 후에 잘못되었다고 생각했는데 -init가 할당을위한 장소라고 생각했습니다.

관련 문제