2009-10-09 3 views
0

각기 다른 NIB 파일을 사용하는 ViewController로 두 개의 속성을 설정했습니다. (남성과 여성 모델은 동일하게 작동하지만 시각적으로 다른 설정입니다.) 전달한 NIB 이름과 ViewController를 기반으로 ViewController를 만드는 기능이 하나 있습니다.함수에 속성 ​​전달 및 유지할 값 설정

ViewController 속성이 유지된다. 함수 내에 실제 속성 이름을 추가하고 설정하면 viewController가 설정되고 ViewController가 유지됩니다. 다음은 .m 파일에있는 것입니다 (도움을 얻는 데 필요한 것을 보여줌). 내가 시도한 두 개의 주석 행을 보관 해 두었습니다. 내 등록 정보 파일 .H에서

@synthesize femaleModelViewController; 
@synthesize maleModelViewController; 


    - (void) loadModelViewControllerWithModelType:(NSString*) model ModelView:(ModelViewController *)modelViewController { 
     ModelViewController *viewController = [[ModelViewController alloc] initWithNibName:model bundle:nil]; 
    // [self setFemaleModelViewController:viewController]; // I don't want to set the property here, I want to be able to pass it as an argument. 
     modelViewController = viewController; 
    // [modelViewController retain]; // I even tried to retain it do see if would but it doesn't. 
     [viewController release]; 
    } 

    - (void)viewDidLoad { 
     [super viewDidLoad]; 
     [self loadModelViewControllerWithModelType:@"FemaleModel" ModelView:femaleModelViewController]; 
     [self loadModelViewControllerWithModelType:@"MaleModel" ModelView:maleModelViewController]; 


} 

은과 같이 설정은 다음과 같습니다

@property (nonatomic, retain) ModelViewController *femaleModelViewController; 
@property (nonatomic, retain) ModelViewController *maleModelViewController; 

답변

0

당신은 maleModelViewControllerfemaleModelViewController에 새로운 ModelViewController를 할당하려고합니까? 그렇다면 잘못된 방향으로 가고 있습니다.

솔직히 말해서, 나는 완전히 loadModelViewControllerWithModelType:modelView: 방법을 사용하지 않을 것입니다. 당신이 viewDidLoad 수행해야 할 모든이있다 :

maleModelViewController = [[ModelViewController alloc] initWithNibName:@"MaleModel"]; 
femaleModelViewController = [[ModelViewController alloc] initWithNibName:@"FemaleModel"]; 

(. 이것은 가정 maleModelViewControllerfemaleModelViewController 같은 이름의 속성을 백업 인스턴스 변수가 있음)

당신이 maleModelViewControllerfemaleModelViewController 전달, 변수에 대한 참조를 전달하지 않고 값을 전달합니다. 초기화되지 않았으므로 수행중인 작업은 nil입니다. 현재 수행하려는 작업을 수행하려면 포인터을 변수에 (예 : ModelViewController **으로 선언하고 &maleModelViewController&femaleModelViewController으로 전달하고 *modelViewController = viewController을 사용하여 할당해야합니다.) C# 또는 Java와 같은 참조별로 사용하기 쉬운 언어를 사용하여 C에서 작동하는 방법을 읽어야합니다 (C와 Objective-C의 규칙은 동일합니다).

하지만 여전히 과용입니다.

또한 돌아서 viewController을 출시했기 때문에 코드가 작동하지 않습니다.이 코드는 즉시 참조가 해제되었으므로 즉시 할당 취소됩니다. 당신이 alloc 그것을 편집 할 때부터 왔습니다. 프로그램을 사용하려고하자마자 프로그램을 중단시킬 수있는 참조가 할당 될 것입니다.

+0

감사합니다. 그래, 나는 그것을 주소와 값을 통해 전달하는 것을 완전히 잊었다. Objective-C와 C# 사이를왔다 갔다하면됩니다. 이 샘플은 과도한 것처럼 보이지만 간단하게 선언하는 것보다 메소드에서 더 많은 일이 계속 될 것입니다. 만약 내가 여기 그것을 유지해야 올바른지? –

+0

어디에서 보관 하시겠습니까? 객체에 대한 유지 된 참조를 얻는 방법에는 두 가지가 있습니다 :'alloc' it 또는'retain '. 할당 한 경우에도 보유 할 필요가 없습니다. 또한 할 초기화가 더 많아도, 뷰 컨트롤러의 'initWithNibName : owner :'메소드에 속할 것이며, 클래스가 무엇이든 상관 없습니다. 수업을 너무 단단히 묶지 마십시오. 그렇지 않으면 전체 응용 프로그램이 깨지기 쉽습니다. – Alex