2012-06-13 2 views
0
#import "PsychologistViewController.h" 
#import "HappinessViewController.h" 

@interface PsychologistViewController() 
@property (nonatomic) int diagnosis; 
@end 

@implementation PsychologistViewController 

@synthesize diagnosis = _diagnosis; 

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 

{ 
     if ([segue.identifier isEqualToString:@"ShowDiagnosis"]) { 
     [segue.destinationViewController setHappiness:self.diagnosis]; 
     } 
     else if ([segue.identifier isEqualToString:@"Celebrity"]) { 
     [segue.destinationViewController setHappiness:100]; 
     } 
     else if ([segue.identifier isEqualToString:@"Serious"]) { 
     [segue.destinationViewController setHappiness:20]; 
     } 
     else if ([segue.identifier isEqualToString:@"TV Kook"]) { 
     [segue.destinationViewController setHappiness:50]; 
     } 
} 

****- (void)setAndShowDiagnosis:(int)diagnosis**** 
{ 
    self.diagnosis = diagnosis; 
    [self performSegueWithIdentifier:@"ShowDiagnosis" sender:self]; 
} 

-(IBAction)flying 
{ 
    [self setAndShowDiagnosis:85]; 
} 

-(IBAction)apple 
{  
[self setAndShowDiagnosis:100]; 
} 

-(IBAction)dragons 
{ 
    [self setAndShowDiagnosis:20]; 
} 

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return YES; 
} 

@end 

내 질문에 대한 답변이 - (void)setAndShowDiagnosis:(int)diagnosis과 관련이 있습니다. 이 방법은 어느 .h 파일에서도 public으로 선언되지 않으며 개인적으로도 공개되지 않습니다. 내 질문은이 이유가되는 이유입니다. 단지 setter 구현을 보여 주지만 실제 메소드 선언은 어디에도 없습니다. 이 점을 분명히하는 데 도움이 될만한 점이 있습니다. 아, 그리고 이것은 온라인 강연에서 나온 것입니다. 모든 것이 잘 컴파일되고 실행됩니다.Objective-C에서 선언되지 않은 메서드

답변

0

이 방법은 공개적으로 .h 파일에서 공개되지 않으며 분명히 개인적으로 존재하지 않습니다.

나는 당신이 당신의 자신의 질문에 대답했다고 생각합니다. 그것은 선언되지 않았기 때문에, 선언되지 않았습니다. 내가 틀린 것을 읽지 않는 한?

1

메서드는 공개적으로, 비공개 적으로 선언 할 필요가 없습니다. .h 파일에서 메소드를 선언하면 클래스의 다른 사용자가 해당 메소드에 대한 지식을 갖게됩니다. 그것을 선언하지 않으면 클래스를 사용하는 나머지 프로그램에서 해당 메서드를 숨길 수 있습니다.

+0

+1. 인터페이스 선언의 요점은 클래스의 인터페이스를 정의한다는 것입니다. C++ 또는 Java에서 "개인 메소드"라고 부르는 것은 인터페이스의 일부가 아니므로 인터페이스 선언에 포함시켜야 할 이유가 없습니다. (C++에서는 컴파일러가 정적으로 함수 호출을 해결하고 vtable을 빌드 할 수 있으므로 Java에서는 별도의 선언 및 정의가 없기 때문에 Java에 있어야합니다. ObjC에서는 그 중 어느 것도 적용되지 않습니다.) – abarnert

0

메소드를 비공개로 선언 할 필요는 없습니다. 객관적으로 사적 방법은 없다. c.

헤더 파일에서 메소드를 선언하는 것과 임 플 레이션 파일 맨 위에서 클래스 확장을 사용하는 것의 차이점은 헤더에 선언하지 않고 다른 클래스의 메소드를 사용하면 컴파일러가 방법이 존재하지 않을 수도 있음을 경고합니다. 그러나 메소드를 구현하는 동안 애플리케이션이 중단되지 않고 메소드가 호출됩니다.

아무 곳에서나 메소드를 선언하지 않아도되지만 컴파일러 경고가 많이 발생하고 나중에 읽을 수 없으며 다른 사람들이 코드를 이해하기가 더 어려워집니다. 그리고 메소드 이름이나 다른 사소한 실수가 빠져서 충돌을 일으킬 가능성이 커집니다.

+0

사실이 아닙니다. "객관적으로 사적과 같은 것이 없다." 아주 명확하게 그런 것이 있습니다. 메소드 선언에는 적용되지 않습니다. – abarnert

+0

Private는 obj-c 메소드에 실제로 적용되지 않습니다. Jonathan이 말했듯이 컴파일러가 경고를 받겠지만, 앞에 선언되지 않은 경우에도 객체에 대한 메소드를 호출 할 수 있습니다. –

+0

죄송합니다, 당신이 정확합니다. 나는 방금 "방법"이라는 단어를 놓쳤다. –